Распространение ошибок (мега) парсек через продолжения
У меня есть несколько технический вопрос о внутренней работе (Мега) Парсек, неформальный контекст которого:
Какова идея, управляющая накоплением / распространением сообщений об ошибках через продолжения в
Parsec
?
В частности: рассмотрим mplus
выполнение операций ParsecT
экземпляр MonadPlus
, ( источник)mplus m n
принимает в качестве входных данных строку s
разобрать и продолжения cok
, cerr
, eok
, а также eerr
следовать на основе результата разбора.
Первый разбор s
с m
:
- Если анализ завершается успешно и потребляет (соответственно не потребляет) часть
s
, следоватьcok
(соответственно,eok
) продолжение. - Если разбор
s
сm
терпит неудачу, потребляя частьs
, следоватьcerr
продолжение. - Предположим, разбор
s
сm
терпит неудачу, ничего не потребляя; позволятьerr
быть ошибка разбора, связанная с этой ошибкой. Затем мы попробуем разобратьs
сn
и выберите продолжение соответственно:- Если разбор
s
сn
успешно при использовании ввода, следуйтеcok
продолжение. - Если разбор
s
сn
не удается при использовании ввода, следуйтеcerr
продолжение. - Если разбор
s
сn
преуспевает, не потребляя ввод, следуйте за продолжениемneok
происходит отeok
:neok y s' err' = eok y s' (mergeError err err')
- Если разбор
s
сn
не требует ввода, следуйте за продолжениемneerr
происходит отeerr
:neerr y s' err' = eerr (mergeError err err')
- Если разбор
Мой вопрос:
Почему мы объединяем ошибки, когда следуем за "пустым" продолжением, а не когда следуем за "потребленным" продолжением, тем самым забывая обо всех предыдущих ошибках?
Это должно быть дизайнерское решение, но я не могу понять причину этого. Может быть, есть простой пример, который бы прояснил это?