我正在阅读 << real world haskell >> Chapter 8 并想看看 SumFile.hs 程序如何处理 100 万个数字:
main :: IO ()
main = do
contents <- getContents
print (sumFile contents)
where sumFile = sum . map read . words
当我向程序提供 100 万个整数时:
runhaskell SumFile.hs < data.txt,程序给出了正确的结果。
但是,当我使用 GHC 编译它时:
ghc SumFile.hs
二进制文件给出“堆栈空间溢出”错误:
./SumFile < data.txt
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
我有两个问题:
- 是什么导致堆栈空间使用?
- 为什么编译版本与解释版本不同,我该怎么办?
谢谢!
编辑:
好吧,原因是 map,但这是一个使用惰性字节串的修改版本:
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as LCHAR
import Data.Monoid
import Data.List
main :: IO ()
main = do
contents <- L.getContents
case sumFile contents of
Nothing -> print "Invalid input"
Just s -> print $ getSum s
where sumFile = foldl' mappend (Just (Sum 0)) . map ((fmap Sum) . (fmap fst) . LCHAR.readInt) . (LCHAR.words)
结果是一样的:即使我没有使用 sum,二进制版本也会占用堆栈空间。