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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta