Я написал следующий код синтаксического анализа, используя attoparsec
:
data Test = Test {
a :: Int,
b :: Int
} deriving (Show)
testParser :: Parser Test
testParser = do
a <- decimal
tab
b <- decimal
return $ Test a b
tParser :: Parser [Test]
tParser = many' $ testParser <* endOfLine
Это отлично работает для файлов небольшого размера, я выполняю это так:
main :: IO ()
main = do
text <- TL.readFile "./testFile"
let (Right a) = parseOnly (manyTill anyChar endOfLine *> tParser) text
print a
Но когда размер файла превышает 70 МБ, он потребляет тонны памяти. В качестве решения я решил использовать attoparsec-conduit
. После изучения их API , я не уверен, как заставить их работать вместе. Мой анализатор имеет тип Parser Test
, но sinkParser
фактически принимает анализатор типа Parser a b
. Меня интересует, как выполнить этот парсер в постоянной памяти? (Решение на основе каналов также приемлемо, но я не привык к Pipes API.)