list - 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
解决方案
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
在您的代码中,您使用的是sum
from Data.Foldable
。sum
具有以下签名:
λ> :t sum
sum :: (Foldable t, Num a) => t a -> a
这意味着它需要一个具有类实例的数据类型Foldable
才能工作,而这List
显然没有。
推荐阅读
- intellij-idea - 从 IntelliJ IDEA 运行 Junit 测试时出错
- java - 有没有办法在 GraalVM 原生映像中使用 kotlin.random.Random
- ruby-on-rails - 在 Rails 上使用 ruby 时,Rails 服务器或 Rails s 不工作
- java - GitHub 分发的 Java DB 路径
- android - 将 Scala 和 libGDX 与 Gradle 一起使用的 Android 运行时错误
- java - 如何将时间以毫秒为单位转换为 timeInSeconds 和 offsetInNanos?
- typescript - Ember Octane - 从控制器访问路由模型
- android - 错误:找不到符号 setAdapter(FirebaseListAdapter
) - ruby-on-rails - rake 任务被多次调用
- algorithm - 按 COVID 的姓氏将人们分配到购物日