Parsec - это библиотека монадического анализа, поэтому вам, вероятно, следует сначала познакомиться с монадами и синтаксическим сахаром, который является нотацией do.
nesting
- это анализатор, который вы можете увидеть как вычисление (монаду) с результатом типа Int
.
Всякий раз, когда вы видите код, подобный этому n <- nesting
, в блоке do, это означает, что нужно запустить вложение монад и связать результат с n
.
Чтобы увидеть, как работает этот парсер, попробуйте запустить его вручную. Например, используйте строку "()
".
Это выглядит так:
- Пытается выполнить синтаксический анализатор в блоке do, успешно разбирает '
(
', рекурсивно запускает синтаксический анализатор и связывает результат с n
.
- Пытается выполнить синтаксический анализатор в блоке do, не может выполнить синтаксический анализ '
(
', пытается выполнить следующий синтаксический анализатор (return 0
), который всегда выполняется со значением 0
.
n
теперь имеет значение 0, потому что это было результатом рекурсивного запуска парсера. Следующим в блоке do является синтаксический анализатор char ')'
, он завершается успешно, рекурсивно вызывает синтаксический анализатор и связывает результат с m
. То же, что и выше, результат в m
равен 0
.
Теперь весь результат вычисления равен max (n+1) m
, что составляет 1
.
Как вы можете видеть, это разбирает вложенные скобки, и примерно на верхнем уровне n
содержит число проанализированных '('
, а m
содержит число проанализированных ')'
.