在Windows上键入以下GHCI:
foldl (+) 0 $ take 100000000 $ map sqrt [1..]
给出:
<interactive>: out of memory
在编译(使用GHC)并运行此程序时:
main = do
let score = foldl (+) 0 $ take 100000000 $ map sqrt [1..]
putStrLn $ show score
打印预期答案而没有内存错误。
这种行为有原因吗?在我看来,像Haskell的懒惰应该防止这一个班轮崩溃。
答案 0 :(得分:15)
只是GHC做了严格和其他优化。 GHCi没有做完全编译器所做的那种优化。
特别是foldl
正在积累太多的thunk,这些正在导致你的溢出。然而,当我将其更改为严格foldl'
时,即使GHCi也可以处理它。您应该阅读this question以了解更多相关原因。