は私のコードです: スタックスペースのオーバーフロー:haskellでスタックオーバーフローエラーなしで大きなファイルを処理する方法は?
import System.IO
import Data.Maybe
readL::(Int,Int,Int)->IO()
readL (w,l,-1) = do
putStrLn $ "word:" ++(show w)++"\nline:"++(show l)
readL (w,l,0) = do
s<-hIsEOF stdin
if s
then readL (w,l,-1)
else
do
f<-getLine
readL (w+length f,l+1,0)
main = do
hSetBinaryMode stdin True
readL (0,0,0)
私はサイズの100メートルでファイルを処理し、それだけでエラーが発生し、クラッシュ(ファイルの行のnumと単語数を取得)現在のサイズ8388608バイト
私が間違って書いたことはありますか?私はHaskellの中にちょうど新しい学習者よ、誰もがこれをsloveすることができ、
import System.IO
import Data.List
main = do
hSetBinaryMode stdin True
interact $ (\(w,l)->"line:"++(show l)++"\nwords:"++(show w)++"\n"). foldl' (\(w,l) r-> (w + length r,l+1)) (0,0) .lines
これも同じ問題を抱えている...と、多くのメモリと、そう?
は、私もここで別のバージョンがあります。
で
seq
を使用するための厳格なペアタイプを使用することができ、感謝とても大変です! – vzexなぜ 'foldl 'が役に立たないのかという言葉をいくつか追加しました。 –
最後の質問は、ループバージョンよりもfoldl 'バージョンの方が遅いですか?つまり、foldlのバージョンはすべての行をメモリに分割して処理します。あるいは、lazyの機能のために、linuxのパイプのように、ループバージョンのように動作しますか? – vzex