Я хочу разобрать первую строку CSV-файла и получить в результате список парсеров и с треском провалиться.
После некоторых упрощений я получил код, который, я думаю, должен работать, но он не работает, и я не понимаю, почему.
Вот:
{-# LANGUAGE OverloadedStrings #-}
import Data.Text
import Data.Attoparsec.Text
import Control.Applicative
doTestSep :: [String] -> Parser [String]
doTestSep t = do
(endOfLine >> return t)
<|> (char ';' *> doTestParse t)
doTestParse :: [String] -> Parser [String]
doTestParse t = do
(string "<FIELD1>" *> doTestSep ("field1" : t))
<|> (string "<FIELD2>" *> doTestSep ("field2" : t))
test = parseOnly (doTestParse []) "<FIELD1>"
Я звоню test
, ожидая получить что-то вроде
> Right ["field1"]
но вместо этого я получаю
> Left "Failed reading: takeWith"
Что я делаю не так?
endOfLine
говорится: Сопоставьте либо один символ новой строки '\n', либо возврат каретки, за которым следует символ новой строки \r\n.. Однако ваш ввод не содержит ни \n, ни \r\n, так что парсер выйдет из строя. - person bennofs   schedule 31.08.2014