foldl'的默认定义和foldr'看起来很奇怪

时间:2018-05-09 06:27:27

标签: haskell evaluation fold

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)
    -- ...

1 个答案:

答案 0 :(得分:1)

一般来说,foldl'最适用于看起来像缺点列表的内容,foldr'最适合看起来像snoc-lists的内容。情况是对称的,所以我们只看一下清单,foldl'最好是好的。

您可能已经读过,foldl如果缺乏足够的优化,那么因为缺点会导致空间泄漏。那么,这就是将要发生的事情。 f'是严格的,但在折叠到达列表末尾之前不会要求其结果!

默认定义稍有不同,这使得即使是天真的编译(或解释)也能正常工作。