Распространение ошибок (мега) парсек через продолжения

У меня есть несколько технический вопрос о внутренней работе (Мега) Парсек, неформальный контекст которого:

Какова идея, управляющая накоплением / распространением сообщений об ошибках через продолжения в 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')

Мой вопрос:

Почему мы объединяем ошибки, когда следуем за "пустым" продолжением, а не когда следуем за "потребленным" продолжением, тем самым забывая обо всех предыдущих ошибках?

Это должно быть дизайнерское решение, но я не могу понять причину этого. Может быть, есть простой пример, который бы прояснил это?

0 ответов

Другие вопросы по тегам