Haskell Parsec combinator 'many' jest stosowany do parsera, który akceptuje pusty łańcuch
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
Kiedy uciekamparseTest items "a|b|c"
z powyższym kodem otrzymuję następujący błąd:
*** Exception: Text.ParserCombinators.Parsec.Prim.many:
combinator 'many' is applied to a parser that accepts an empty string.
Wierzę, że ma to coś wspólnegoeof
imany item
, jeśli usunęeof
, wtedy mogę go uruchomić tak długo, jak długo linia się nie skończyeof
, co czyni go bezużytecznym.
Zdaję sobie sprawę, że mogę po prostu użyćsepBy
ale interesuje mnie, dlaczego ten kod nie działa i jak to działa.