首页 > 解决方案 > Haskell 将一个列表与测试用例相加

问题描述

所以我有以下代码:

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

标签: listfunctionhaskell

解决方案


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.Foldablesum具有以下签名:

λ> :t sum
sum :: (Foldable t, Num a) => t a -> a

这意味着它需要一个具有类实例的数据类型Foldable才能工作,而这List显然没有。


推荐阅读