今天我正在Haskell写一个小程序。我发现,在ghci中的交互模式,这样的:这为什么会打败Haskell的懒惰评价?
take 100 $ foldl (\s a -> s ++ [last s + a]) [0] (1:[6,12..])
会挂起ghci中,并使其崩溃,由于内存不足,但这:
take 100 $ foldl (\s a -> s ++ [last s + a]) [0] (1:[6,12..606])
可以运行得很好。
为什么Haskell的懒惰评估不能使第一个在内存(3G,BTW)内运行?或者,也许这是ghci的怪癖?
感谢您的任何意见!
问题是'foldl'在生成任何输出之前总是遍历整个列表,因此对于无限的数据结构是无用的。你可能想要正确的折叠 - “折叠”。可能还有更多,但这是一个很好的起点。 – Vitus 2012-03-30 06:23:20