所以我有以下代碼:
data List = Empty | Cons Integer List deriving Show
list = Cons 1 (Cons 7 (Cons 9 (Cons 3 Empty)))
現在我想用這個函式總結從上面創建的串列:
-- sumList
sumList :: List -> Integer
sumList = sum
我也有一個測驗用例:
testSum = putStrLn ("expected: 20\ncomputed: " show (sumList list))
我的問題是,我收到以下錯誤訊息:
? Couldn't match type ‘List’ with ‘t0 Integer’
Expected type: List -> Integer
Actual type: t0 Integer -> Integer
? In the expression: sum
In an equation for ‘sumList’: sumList = sum
uj5u.com熱心網友回復:
data List = Empty | Cons Integer List deriving Show
sumList :: List -> Integer
sumList Empty = 0
sumList (Cons x xs) = x sumList xs
如您所見,由于List是遞回資料型別,這意味著它可以保存自身的實體,因此我們需要遞回地打開成員并將它們添加在一起。
作為測驗:
λ> list = Cons 1 (Cons 7 (Cons 9 (Cons 3 Empty)))
λ> sumList list
20
在您的代碼中,您使用的是sumfrom Data.Foldable。sum具有以下簽名:
λ> :t sum
sum :: (Foldable t, Num a) => t a -> a
這意味著它需要一個具有Foldable類實體的資料型別才能作業,而這List顯然沒有。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/328982.html
