[英]Haskell Recursive List Summation
我是函數式編程和Haskell的新手,所以我只是通過嘗試一些Euler問題來開始學習兩者。 這涉及大量列表求和。
因此,我嘗試編寫一個遞歸列表求和函數,該函數將一個列表作為輸入並返回一個整數作為輸出,例如:
-- Sum up a list
listsum :: [int] -> int
listsum [a:b:[]] = a + b
listsum x = head x + listsum tail x
編譯此代碼時,我收到此錯誤:
Couldn't match expected type `[[int] -> int]'
with actual type `[a0] -> [a0]'
Relevant bindings include
x :: [int]
(bound at C:\Users\Rade\Documents\GitHub\haskell\euler_2.hs:15:9)
listsum :: [int] -> int
(bound at C:\Users\Rade\Documents\GitHub\haskell\euler_2.hs:14:1)
Probable cause: `tail' is applied to too few arguments
In the first argument of `listsum', namely `tail'
In the second argument of `(+)', namely `listsum tail x'
我已經嘗試研究模式匹配,但是我無法理解預期類型與實際類型的含義。 我要去哪里錯了?
listsum [a:b:[]] = a + b
在這里, a:b:[]
表示列表[a, b]
,所以[a:b:[]]
表示[[a, b]]
,這不是您想要的。
只需將其更改為
listsum (a:b:[]) = a + b
現在,在
listsum x = head x + listsum tail x
部分listsum tail x
表示將listsum
應用於tail
,然后將結果應用於x
。 我想您的意思是將tail
應用於x
,然后將listsum
應用於結果 ,該結果可以表示為listsum (tail x)
。
我建議使用一個更簡潔的實現,該實現假定將空列表相加得出零。
listsum [] = 0
listsum (x:t) = x + listsum t
這在功能上與您的實現有所不同,因為它可以正確處理具有零個或一個元素的列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.