簡體   English   中英

Haskell遞歸列表求和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM