Haskell中的求和符号

时间:2009-08-27 06:16:27

标签: math haskell recursion sum

在关于summation的维基百科页面上,它说Haskell中的等效操作是使用 foldl 。我的问题是:是否有任何理由说它使用此而不是 sum ?是否比另一个更“纯粹”,或者没有真正的区别?

6 个答案:

答案 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”来定义的,这是加号操作。