【发布时间】:2010-11-23 06:34:43
【问题描述】:
在关于summation 的维基百科页面上,它说Haskell 中的等效操作是使用foldl。我的问题是:有什么理由说要使用它而不是 sum?一个比另一个更“纯粹”,还是没有真正的区别?
【问题讨论】:
标签: math haskell recursion sum
在关于summation 的维基百科页面上,它说Haskell 中的等效操作是使用foldl。我的问题是:有什么理由说要使用它而不是 sum?一个比另一个更“纯粹”,还是没有真正的区别?
【问题讨论】:
标签: math haskell recursion sum
foldl 是一个通用的tail-recursive reduce 函数。递归是在函数式编程语言中处理项目列表的常用思维方式,它提供了一种循环迭代的替代方法,通常更优雅。对于像fold 这样的reduce 函数,尾递归实现is very efficient。正如其他人所解释的那样,sum 只是foldl (+) 0 l 的方便助记符。
大概它在维基百科页面上的使用是为了说明通过尾递归求和的一般原则。但是由于 Haskell Prelude 库包含 sum,它更短且更易于理解,因此您应该在代码中使用它。
这是 Haskell 的 fold 函数中的 nice discussion,其中包含非常值得一读的简单示例。
【讨论】:
我没有看到它在那个维基百科页面上提到了关于 Haskell 或 foldl 的任何内容,但 Haskell 中的 sum 只是 foldl 的一个更具体的例子。可以这样实现,例如:
sum l = foldl (+) 0 l
可以简化为:
sum = foldl (+) 0
【讨论】:
需要注意的一点是 sum 可能比你想要的更懒,所以考虑使用 foldl'。
【讨论】:
正如其他人所说,没有区别。但是,sum-call 比 fold-call 更容易阅读,所以如果您需要求和,我会选择 sum。
【讨论】:
没有区别。该页面只是说sum 是使用foldl 实现的。只需在需要计算数字列表的总和时使用sum。
【讨论】:
求和的概念可以扩展到非数字类型:您所需要的只是相当于一个 (+) 操作和一个零值的东西。换句话说,您需要一个monoid。这导致了 Haskell 函数“mconcat”,它返回一个 monoid 类型的值列表的总和。默认的“mconcat”当然是根据“mappend”定义的,即加号操作。
【讨论】: