Foldl vs Foldr内存使用情况

时间:2018-12-04 20:04:18

标签: haskell fold

给出斐波那契无限列表

fibo a b = a : fibo b (a+b)

并给出以下两个调用:

  • foldl (+) 1 (take 1000000 $ fibo 1 1)
  • foldr (+) 1 (take 1000000 $ fibo 1 1)

我期望第一个(foldl)由于重击而分配大量内存,实际上就是这样。

但是,我没想到第二个相同。由于文件夹的定义方式,我认为通常会为(+)的正确参数执行类似求值的堆栈(由于其严格性)。

实际上,即使在这种情况下,我也会分配大量的内存。

发生了什么事?

1 个答案:

答案 0 :(得分:6)

foldr f z xs严格要求第二个参数(例如f)时,

(+)效率低下,因为它的计算结果为

f1 x1 (f x2 (f x3 ...

,直到列表的最后才开始计算。如果f对第二个参数不严格,则可以更早地开始评估。