2013-04-26 33 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以瞭解更多關於這是爲什麼。