проблема парсек в Haskell - PullRequest
1 голос
/ 23 марта 2011

Я новичок в Haskell и в lernning parsec lib пример:

nesting :: Parser Int
nesting = do{ char '('
            ; n <- nesting
            ; char ')'
            ; m <- nesting
            ; return (max (n+1) m)
            }
        <|> return 0  

так что же n или m?почему n и m int и больше 0?

1 Ответ

3 голосов
/ 23 марта 2011

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 содержит число проанализированных ')'.

...