Я пытаюсь понять, как Parse c сбрасывает свое состояние и что является частью этого состояния. Я удивлен поведением следующего кода:
parseAbReset :: Parser Char
parseAbReset = do
st <- getParserState
char 'A'
ret <- char 'b' <|> (setParserState st >> fail mempty)
return ret
parseFinal :: Parser Char
parseFinal = parseAbReset <|> (char 'A' >> char 't')
Я ожидаю, что parseFinal
успешно проанализирует "At". Вот мои рассуждения (| обозначает текущее состояние на входе): <|>
пытается parseAbReset
, который анализирует до "A | t", затем он не работает на char 'b'
без использования ввода и поэтому сбрасывает состояние обратно к «| At», parseAbReset завершается ошибкой (и, по моему мнению, он должен завершиться с ошибкой без использования ввода, так как он сбрасывается в состояние до того, как потребляет ввод). Это позволяет альтернативе (char 'A' >> char 't')
потреблять «At», и мы заканчиваем «At |».
В других примерах я проверял, что setParserState успешно сбрасывает позицию в потоке, но кажется, что состояние он что-то потреблял или нет не сбрасывается.
Любые идеи, как я могу сбросить, потреблял ли он или нет?