вот мой код: (получить файл Номер строки и количество слов)Как обрабатывать большой файл без ошибки переполнения стека в 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 м, она просто падает с ошибкой: Стек переполнения пространства: текущий размер 8388608 байт
Есть ли что-то, что я написал неправильно?
У меня также есть другой вариант здесь:
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
это та же проблема тоже ... и с большим количеством памяти, так что, кто-нибудь может SLOVE это я просто новый ученик в Haskell?.
Я сделал это, спасибо u очень много! – vzex
Я добавил несколько слов о том, почему 'foldl'' не помогает. –
Заключительный вопрос, версия foldl 'медленнее, чем версия цикла? Я имею в виду, что версия foldl будет разделять все строки на память, а затем обрабатывать ее, или, из-за ленивой функции, как и в linux, она будет действовать как версия цикла? – vzex