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

dna*_*dna 2 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'"
Run Code Online (Sandbox Code Playgroud)

那么为什么sum(x,y)与sum(x,y,z)相比能够输出一些东西

bra*_*drn 5

在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)

  • @RobinZigmond正确。我的意思是,在两种语言中,列表用于相同的概念(值列表),而元组则不是。 (3认同)
  • “两种语言的清单几乎相同”-我会对此表示怀疑。Haskell的列表是真正的“链接列表”,而我很确定Python的“列表”实际上是数组。(因此,效率更高-Haskell列表在许多要在Python中使用列表的事情上效率很低。) (2认同)