首先,现实世界哈斯克尔我正在读的书说永远不要使用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(使用前将#替换为@)