Haskell,sum(x,y)与sum(x,y,z)之间的差异

时间:2019-03-18 10:32:35

标签: haskell sum

我对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)相比能输出一些东西

1 个答案:

答案 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