在关于summation的维基百科页面上,它说Haskell中的等效操作是使用 foldl 。我的问题是:是否有任何理由说它使用此而不是 sum ?是否比另一个更“纯粹”,或者没有真正的区别?
答案 0 :(得分:11)
foldl
是一般tail-recursive缩减功能。递归是思考在函数式编程语言中操作项列表的常用方法,并提供了循环迭代的替代方法,通常更加优雅。对于像fold
这样的reduce函数,尾递归实现is very efficient。正如其他人所解释的那样,sum
只是foldl (+) 0 l
的一个方便的助记符。
据推测,它在维基百科页面上的使用是为了说明通过尾递归求和的一般原理。但是由于Haskell Prelude库包含sum
,它更短且更易于理解,因此您应该在代码中使用它。
这是Haskell fold
函数的nice discussion,其中包含一些非常值得阅读的简单示例。
答案 1 :(得分:3)
我在维基百科页面上看不出Haskell或foldl
的任何内容,但Haskell中的sum
只是foldl
的一个更具体的例子。它可以像这样实现,例如:
sum l = foldl (+) 0 l
可以减少为:
sum = foldl (+) 0
答案 2 :(得分:2)
有一点需要注意的是,总和可能比你想要的更懒,所以考虑使用foldl'。
答案 3 :(得分:1)
正如其他人所说,没有区别。但是,总和通话比打电话更容易阅读,所以如果你需要求和,我会去求和。
答案 4 :(得分:0)
没有区别。该页面只是说sum
是使用foldl
实现的。只要您需要计算数字列表的总和,就可以使用sum
。
答案 5 :(得分:0)
求和的概念可以扩展到非数字类型:你需要的只是一个(+)操作和一个零值。换句话说,您需要一个monoid。这导致Haskell函数“mconcat”,它返回monoid类型的值列表的总和。默认的“mconcat”当然是用“mappend”来定义的,这是加号操作。