我对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'"
那为什么sum(x,y)与sum(x,y,z)相比能输出一些东西
答案 0 :(得分:5)
在Python和Haskell中,(x,y,z)
是一个元组,而[x,y,z]
是一个列表。但是,尽管两种语言中的列表几乎相同,但是元组是不同的:Python元组与Python列表相似,而在Haskell中,元组是一个完全不同的概念( EDIT:强>我错了);在Haskell中,元组就像没有字段名称的记录(例如(1, "foo", 'b')
的类型为(Int, String, Char)
)。因此,在Haskell中,您通常不能对元组求和(因为您不能保证每个“字段”都属于同一类型),这基本上就是Could not deduce Foldable
的意思。但是,Prelude中的Foldable
实例确实存在2元组!正如@RobinZigmond所评论的那样,它不能按您期望的方式工作:由于它不能保证两个字段的类型相同,因此它会完全忽略第一个元素:
Prelude> sum (1,2)
2