Haskell Parsec комбинатор 'many' применяется к парсеру, который принимает пустую строку
import Text.ParserCombinators.Parsec
delimiter :: Parser ()
delimiter = do char '|'
return ()
<?> "delimiter"
eol :: Parser ()
eol = do oneOf "\n\r"
return ()
<?> "end of line"
item :: Parser String
item = do entry <- manyTill anyChar (try eol <|> try delimiter <|> eof)
return entry
items :: Parser [String]
items = do result <- many item
return result
Когда я бегуparseTest items "a|b|c"
с кодом выше я получаю следующую ошибку:
*** Exception: Text.ParserCombinators.Parsec.Prim.many:
combinator 'many' is applied to a parser that accepts an empty string.
Я считаю, что это как-то связано сeof
а такжеmany item
если я удалюeof
тогда я смогу заставить его работать, пока строка не заканчиваетсяeof
, что делает его бесполезным.
Я понимаю, что могу просто использоватьsepBy
но меня интересует, почему этот код не работает и как заставить его работать.