Der Haskell Parsec-Kombinator 'many' wird auf einen Parser angewendet, der eine leere Zeichenfolge akzeptiert
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
Wenn ich renneparseTest items "a|b|c"
Mit dem obigen Code erhalte ich den folgenden Fehler:
*** Exception: Text.ParserCombinators.Parsec.Prim.many:
combinator 'many' is applied to a parser that accepts an empty string.
Ich glaube, es hat etwas damit zu tuneof
undmany item
, wenn ich entferneeof
, dann kann ich es zum Laufen bringen, solange die Leitung nicht endeteof
, was es irgendwie nutzlos macht.
Mir ist klar, dass ich es nur gebrauchen könntesepBy
Aber was mich interessiert, ist, warum dieser Code nicht funktioniert und wie man ihn zum Laufen bringt.