5

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

4

1 回答 1

15

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

特别foldl是这会产生太多的重击,而这些重击会导致您的溢出。但是,当我将其更改为严格时,foldl'即使 GHCi 也可以处理它。您应该阅读这个问题以了解更多关于为什么会这样的信息。

于 2013-04-26T03:43:53.480 回答