GHCI在Windows上不那么懒惰?

时间:2013-04-26 03:37:14

标签: haskell lazy-evaluation ghci

在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的懒惰应该防止这一个班轮崩溃。

1 个答案:

答案 0 :(得分:15)

只是GHC做了严格和其他优化。 GHCi没有做完全编译器所做的那种优化。

特别是foldl正在积累太多的thunk,这些正在导致你的溢出。然而,当我将其更改为严格foldl'时,即使GHCi也可以处理它。您应该阅读this question以了解更多相关原因。