给出斐波那契无限列表
fibo a b = a : fibo b (a+b)
并给出以下两个调用:
foldl (+) 1 (take 1000000 $ fibo 1 1)
foldr (+) 1 (take 1000000 $ fibo 1 1)
我期望第一个(foldl)由于重击而分配大量内存,实际上就是这样。
但是,我没想到第二个相同。由于文件夹的定义方式,我认为通常会为(+)的正确参数执行类似求值的堆栈(由于其严格性)。
实际上,即使在这种情况下,我也会分配大量的内存。
发生了什么事?
答案 0 :(得分:6)
foldr f z xs
严格要求第二个参数(例如f
)时, (+)
效率低下,因为它的计算结果为
f1 x1 (f x2 (f x3 ...
,直到列表的最后才开始计算。如果f
对第二个参数不严格,则可以更早地开始评估。