Существует объяснение необходимости feed
в ответах на этого вопроса StackOverflow .Как говорит Брайан О'Салливан (создатель Attoparsec):
Если вы пишете синтаксический анализатор attoparsec, который потребляет столько входных данных, сколько возможно до сбоя, вы должны указать частичное продолжение результата, когда выдостиг конца вашего ввода.
Вы можете сделать это, введя пустую строку.
Я признаю, что написал соответствующий код, и на самом деле я не сделал 'В этом случае используйте pointfree
.Простая композиция для меня здесь имеет смысл: вы запускаете парсер (A.parse environment
), вы говорите, что все готово (flip A.feed B.empty
), и вы конвертируете в Maybe
как базовую обработку ошибок (* 1016)*).На мой взгляд, это выглядит чище, чем указанная версия:
parseEnvironment b = maybeResult $ A.feed (A.parse environment b) B.empty
Остальное, я думаю, довольно идиоматический аппликативный разбор , хотя я не уверен, почему я бы использовал >>
вместо *>
.