с учетом парсера
newtype Parser a = Parser { parse :: String -> [(a,String)] }
(>>=) :: Parser a -> (a -> Parser b) -> Parser b
p >>= f = Parser $ \s -> concat [ parse (f a) s' | (a, s') <- parse p s ]
return :: a -> Parser a
return a = Parser (\s -> [(a,s)])
item :: Parser Char
item = Parser $ \s -> case cs of
"" -> []
(c:cs) -> [(c,cs)]
Мы можем видеть, что item
потребляет часть заданной ему входной строки ("abc" -> [('a', "bc")]
). Был ли когда-нибудь случай, когда парсер выдает дополнительный вывод строки или заменяет / модифицирует его (например, Parser $ \s -> [((), 'a':s)]
)? Я подозреваю, что это может быть в случае контекстно-зависимых грамматик, но у меня возникли проблемы с нахождением разумного примера.
Есть ли причина, по которой имеет смысл сделать это для реальной проблемы?
Ссылки