首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >foldr与foldl (或foldl')的含义

foldr与foldl (或foldl')的含义
EN

Stack Overflow用户
提问于 2008-12-21 18:53:15
回答 7查看 38.3K关注 0票数 164

首先,我正在阅读的Real World Haskell建议永远不要使用foldl,而要使用foldl'。所以我相信它。

但我不清楚什么时候使用foldr,什么时候使用foldl'。虽然我可以看到它们的不同工作结构摆在我面前,但我太愚蠢了,不知道什么时候“哪个更好”。我猜在我看来,使用哪一个并不重要,因为它们都产生了相同的答案(不是吗?)。事实上,我之前使用这个结构的经验来自于Ruby的injectreduce,它们似乎没有“左”和“右”版本。(附带问题:他们使用的是哪个版本?)

任何可以帮助像我这样的聪明挑战的人的洞察力都将不胜感激!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-12-21 20:41:42

foldr f x ys的递归,其中ys = [y1,y2,...,yk]类似于

代码语言:javascript
复制
f y1 (f y2 (... (f yk x) ...))

foldl f x ys的递归看起来像这样

代码语言:javascript
复制
f (... (f (f x y1) y2) ...) yk

这里一个重要的区别是,如果只使用x的值就可以计算出f x y的结果,那么foldr就不需要检查整个列表。例如

代码语言:javascript
复制
foldr (&&) False (repeat False)

返回False,而

代码语言:javascript
复制
foldl (&&) False (repeat False)

永不终止。(注意:repeat False创建了一个无限列表,其中每个元素都是False。)

另一方面,foldl'是尾递归和严格的。如果您知道无论如何都必须遍历整个列表(例如,对列表中的数字求和),那么foldl'foldr更有空间效率(也可能是时间效率)。

票数 180
EN

Stack Overflow用户

发布于 2010-01-31 06:40:00

foldr看起来像这样:

foldl看起来像这样:

上下文: Haskell维基上的Fold

票数 58
EN

Stack Overflow用户

发布于 2008-12-21 19:01:02

它们的语义不同,所以不能简单地将foldlfoldr互换。一个从左边折叠元素,另一个从右边折叠。这样,运算符将以不同的顺序应用。这对所有非关联操作都很重要,比如减法。

Haskell.org在这个主题上有一个有趣的article

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/384797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档