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

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

最佳答案

一般来说,foldl'最适合看起来有点像缺点列表和 foldr' 的东西最适合看起来有点像 snoc-lists 的东西。情况是对称的,所以让我们看看 cons-lists,其中 foldl'最好是好的。

您可能已经读过 foldl如果 cons-lists 的优化不够好,它可能会导致空间泄漏。嗯,这正是这里会发生的事情。 f'是严格的,但在折叠到达列表末尾之前不要求任何结果!

默认定义稍微有点扭曲,这使得即使是简单的编译(或解释)也能正常工作。

关于haskell - foldl' 和 foldr' 的默认定义看起来很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50246794/

相关文章:

haskell - Semigroup 和 Monoid 实例中的约束差异

Haskell "show is applied to too many type arguments"

haskell - GHC.Prim 中有问题的代码

for-loop - for循环中的golang范围是否保证只被评估一次?

haskell - 提高基于线路的导管性能的方法

c# - 如何从 C# 程序员的角度为 Java 评估做准备?

list - Scala:如何创建包含多个元素的 "eager evaluated"列表?

prolog - 折叠部分 list

javascript - 如何折叠非尾递归算法的数据结构?

haskell - foldl/foldr 查询