foldl'
和foldr'
的默认定义似乎很奇怪。它们的默认定义为:
class Foldable t where
-- ...
foldr' f z0 xs = foldl f' id xs z0
where f' k x z = k $! f x z
-- ...
foldl' f z0 xs = foldr f' id xs z0
where f' x k z = k $! f z x
-- ...
为什么不呢?:
class Foldable t where
-- ...
foldr' f = foldr (\x z -> f x $! z)
-- ...
foldl' f = foldl (\z x -> flip f x $! z)
-- ...
答案 0 :(得分:1)
一般来说,foldl'
最适用于看起来像缺点列表的内容,foldr'
最适合看起来像snoc-lists的内容。情况是对称的,所以我们只看一下清单,foldl'
最好是好的。
您可能已经读过,foldl
如果缺乏足够的优化,那么因为缺点会导致空间泄漏。那么,这就是将要发生的事情。 f'
是严格的,但在折叠到达列表末尾之前不会要求其结果!
默认定义稍有不同,这使得即使是天真的编译(或解释)也能正常工作。