鉴于斐波纳契无限列表
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,我认为对于(+)的正确参数(由于其严格性),将执行像评估这样的通常堆栈.
实际上,即使在这种情况下,我也分配了大量的内存.
怎么了?
foldr f z xs当f它的第二个参数(如(+))严格时,效率很低,因为它的计算结果为
f1 x1 (f x2 (f x3 ...
Run Code Online (Sandbox Code Playgroud)
直到列表的最后才能开始评估.如果f对第二个论点不严格,那么评估可以更早开始.