我感到困惑之间的差异sum (x,y)和sum(x,y,z)。的类型签名sum似乎是(Foldable t, Num a) => t a -> a。我得到的是它接受了一个可折叠t的类型类型Num a。Sum(x,y)始终输出y,并且sum(x,y,z)给出错误:
"Could not deduce (Foldable ((,,) Integer Integer))
arising from a use of `sum'"
Run Code Online (Sandbox Code Playgroud)
那么为什么sum(x,y)与sum(x,y,z)相比能够输出一些东西
在Python和Haskell中,(x,y,z)都是一个元组,而[x,y,z]列表。但是,尽管两种语言的列表几乎相同,元组是不同的:Python元组与Python列表相似,而在Haskell中,元组是一个完全不同的概念(编辑:我错了); 在Haskell中,元组就像没有字段名称的记录(例如(1, "foo", 'b')类型(Int, String, Char))。因此,在Haskell中,您通常不能对元组求和(因为您不能保证每个“字段”都属于同一类型),这基本上是什么Could not deduce Foldable意思。但是,FoldablePrelude中的实例确实存在两个元组!正如@RobinZigmond所评论的那样,它无法按您期望的方式工作:由于它不能保证两个字段都属于同一类型,因此它会完全忽略第一个元素:
Prelude> sum (1,2)
2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |