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)
-- ...
最佳答案 一般来说,foldl’最适合看起来像cons-list的东西,而foldr’最适合看起来像snoc-lists的东西.这种情况是对称的,所以让我们看看缺点,其中foldl’最好是好的.
您可能已经读过,如果缺乏足够的优化,那么对于缺点列表,foldl会导致空间泄漏.嗯,这正是将要发生的事情. f’是严格的,但是直到折叠到达列表末尾才会要求它的结果!
默认定义略有不同,这使得即使是天真的编译(或解释)也能正常工作.