6

在关于求和的维基百科页面上,它说 Haskell 中的等效操作是使用foldl。我的问题是:有什么理由说要使用 this 而不是sum?一个比另一个更“纯粹”,还是没有真正的区别?

4

6 回答 6

11

foldl是一个通用的尾递归归约函数。递归是在函数式编程语言中处理项目列表的常用思维方式,它提供了一种循环迭代的替代方案,通常更优雅。在像这样的 reduce 函数的情况下fold,尾递归实现非常有效。正如其他人所解释sum的那样,这只是foldl (+) 0 l.

大概它在维基百科页面上的使用是为了说明通过尾递归求和的一般原则。但是由于 Haskell Prelude库包含sum更短且更易于理解的 ,因此您应该在代码中使用它。

这是一个关于Haskell函数的很好的讨论fold,其中包含简单的示例,非常值得一读。

于 2009-08-27T06:53:33.207 回答
3

我看不到它在哪里说有关 Haskell 或foldl在该 Wikipedia 页面上的任何内容,但sum在 Haskell 中只是foldl. 可以这样实现,例如:

sum l = foldl (+) 0 l

可以简化为:

sum = foldl (+) 0
于 2009-08-27T06:26:22.277 回答
2

需要注意的一件事是 sum 可能比您想要的更懒惰,因此请考虑使用 foldl'。

于 2009-08-27T11:05:33.540 回答
1

正如其他人所说,没有区别。但是,求和调用比折叠调用更容易阅读,所以如果你需要求和,我会选择求和。

于 2009-08-27T06:44:04.160 回答
0

没有区别。该页面只是说sum使用foldl. 只需sum在需要计算数字列表的总和时使用。

于 2009-08-27T06:38:53.187 回答
0

求和的概念可以扩展到非数字类型:您所需要的只是相当于 (+) 操作和零值的东西。换句话说,你需要一个monoid。这导致了 Haskell 函数“mconcat”,它返回一个 monoid 类型的值列表的总和。默认的“mconcat”当然是根据“mappend”定义的,它是加号操作。

于 2009-08-30T15:54:06.757 回答