У меня есть следующая программа на Haskell для вычисления максимальной суммы подстроки строки целых чисел:Haskell lazy Ошибочные слова не ленивы?
{-# LANGUAGE BangPatterns #-} {-# OPTIONS_GHC -O2 #-}
import Data.Functor
import Data.Maybe
import Data.ByteString.Lazy.Char8 (getContents,lines,readInt,words)
import Prelude hiding (getContents,words,lines)
main = do
cont <- words <$> getContents
putStrLn $ show $ snd $ foldl opt (0,0) $ map (fst.fromJust.readInt) cont
opt (!c,!m) x = (max 0 (c+x),max m (c+x))
Проблемы с этой программой является то, что он читает весь файл в память. Соответствующая программа без BytesString не имеет этой проблемы:
{-# LANGUAGE BangPatterns #-} {-# OPTIONS_GHC -O2 #-}
import Data.Functor
import Data.Maybe
main = do
cont <- words <$> getContents
putStrLn $ show $ snd $ foldl opt (0,0) $ map read cont
opt (!c,!m) x = (max 0 (c+x),max m (c+x))
Он использует только малую постоянную величину памяти, но, конечно, это мучительно медленно (примерно 25x медленнее).
Проблема возникает только для программ, которые читают очень большие строки. Если ввод распределен по нескольким небольшим строкам, ByteString выполняет так, как ожидалось.
Есть ли способ обойти это?
Я должен признать, что я не в состоянии воспроизвести это больше (до тех пор, как я оставляю оптимизации включен) ... – user1531083
ли вам всегда есть OPTIONS_GHC в той же строке, что и другая прагма? Скорее всего, это не поможет для оптимизации. –