Foldl vs Foldr内存使用情况

lpr*_*aat 3 haskell fold

鉴于斐波纳契无限列表

fibo a b = a : fibo b (a+b)
Run Code Online (Sandbox Code Playgroud)

鉴于以下两个电话:

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

我期望第一个(foldl)因为thunk而分配大量内存,事实上就是这样.

但是,我没想到第二个相同.由于如何定义foldr,我认为对于(+)的正确参数(由于其严格性),将执行像评估这样的通常堆栈.

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

怎么了?

chi*_*chi 6

foldr f z xsf它的第二个参数(如(+))严格时,效率很低,因为它的计算结果为

f1 x1 (f x2 (f x3 ...
Run Code Online (Sandbox Code Playgroud)

直到列表的最后才能开始评估.如果f对第二个论点不严格,那么评估可以更早开始.