为什么这会打败Haskell的懒惰评估?

zw3*_*324 3 haskell lazy-evaluation fold ghci

今天我在Haskell写一个小程序.我发现在ghci的交互模式中,这个:

take 100 $ foldl (\s a -> s ++ [last s + a]) [0] (1:[6,12..])
Run Code Online (Sandbox Code Playgroud)

会因为内存不足而挂起ghci并使其崩溃,但是:

take 100 $ foldl (\s a -> s ++ [last s + a]) [0] (1:[6,12..606])
Run Code Online (Sandbox Code Playgroud)

可以运行得很好.

为什么Haskell的懒惰评估不能让第一个在内存中运行(3G,BTW)?或者也许这是ghci的怪癖?

感谢您的任何投入!

Car*_*ten 7

我认为你的问题是这样的:

foldlinfinte列表有一些问题(参见HaskelWiki:Fold)

但是,如果你尝试使用foldr last s将是一个问题.不知道这是否是一个作业,但我想你想自己找到解决方案,所以这里有一个暗示:而不是折叠看起来展开 - 这是一个与fibonaccis例子

  • 不,foldl没有无限列表的问题,只是你有一个问题,程序运行直到时间结束,同时消耗无限量的内存.:) (2认同)