2013-04-26 50 views
4

键入以下内容GHCI在Windows上:GHCI在Windows上不是那么懒惰?

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的懒惰应该可以防止这个内存崩溃。

+9

问题其实太过于懒惰。 – hammar 2013-04-26 04:17:32

回答

14

这只是GHC做严格和其他优化。 GHCi不会进行与完整编译器相同的优化。

特别是,foldl建立了太多的thunk和那些导致你的溢出。但是,当我将其更改为严格的foldl'时,甚至GHCi都可以处理它。您应该阅读this question以了解更多关于这是为什么。