haskell – foldl’和foldr’的默认定义似乎很奇怪

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’是严格的,但是直到折叠到达列表末尾才会要求它的结果!

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

点赞