Foldr 与 Foldl(或 Foldl')的含义

2023-11-24

首先,现实世界哈斯克尔我正在读的书说永远不要使用foldl并改为使用foldl'。所以我相信它。

但我不知道什么时候使用foldr vs. foldl'。尽管我可以看到它们以不同方式工作的结构摆在我面前,但我太愚蠢了,无法理解什么时候“哪个更好”。我想在我看来,使用哪个并不重要,因为它们都会产生相同的答案(不是吗?)。事实上,我之前对这个构造的经验来自 Ruby 的inject和 Clojure 的reduce,似乎没有“左”和“右”版本。 (附带问题:他们使用哪个版本?)

任何可以帮助像我这样有智力障碍的人的见解将不胜感激!


递归为foldr f x ys where ys = [y1,y2,...,yk]好像

f y1 (f y2 (... (f yk x) ...))

而递归foldl f x ys好像

f (... (f (f x y1) y2) ...) yk

这里的一个重要区别是,如果结果f x y可以仅使用以下值进行计算x, then foldr不需要检查整个列表。例如

foldr (&&) False (repeat False)

returns False whereas

foldl (&&) False (repeat False)

永远不会终止。 (笔记:repeat False创建一个无限列表,其中每个元素都是False.)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Foldr 与 Foldl(或 Foldl')的含义 的相关文章

随机推荐