El combinador de Haskell Parsec 'muchos' se aplica a un analizador que acepta una cadena vacía
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
Cuando corroparseTest items "a|b|c"
Con el código anterior obtengo el siguiente error:
*** Exception: Text.ParserCombinators.Parsec.Prim.many:
combinator 'many' is applied to a parser that accepts an empty string.
Creo que tiene algo que ver coneof
ymany item
, si me quitoeof
, entonces puedo hacer que funcione siempre que la línea no termineeof
, lo que lo hace un poco inútil.
Me doy cuenta de que solo podría usarsepBy
pero lo que me interesa es por qué este código no funciona y cómo hacerlo funcionar.