私は << 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.
2 つの質問があります。
- スタック スペースの使用量の原因は何ですか?
- コンパイルされたバージョンが解釈されたバージョンと異なるのはなぜですか? どうすればよいですか?
ありがとう!
編集:
理由はわかりましたマップですが、遅延バイト文字列を使用する変更されたバージョンは次のとおりです。
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)
結果は同じです。合計を使用していないにもかかわらず、バイナリ バージョンはスタック スペースを使い果たします。