Haskell проблема с парсеком

Я новичок в хаскеле и изучаю parsec lib пример:

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

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


person coolmenu    schedule 23.03.2011    source источник
comment
Я понял !! вернуть (n+1) для каждого '(' , так что n равно '(' уровню   -  person coolmenu    schedule 23.03.2011
comment
Кстати, вам не нужны ни фигурные скобки, ни ; для нотации.   -  person fuz    schedule 23.03.2011


Ответы (1)


Parsec — это монадическая библиотека синтаксического анализа, поэтому вам, вероятно, следует сначала познакомиться с монадами и синтаксическим сахаром, которым является нотация do.

nesting — это синтаксический анализатор, который можно рассматривать как вычисление (монаду) с результатом типа Int. Всякий раз, когда вы видите такой код n <- nesting в блоке do, это означает запуск вложения монад и привязка результата к n.

Чтобы увидеть, как работает этот парсер, попробуйте запустить его вручную. Например, используйте строку «()».

Это выглядит так:

  • Tries the parser in the do block, succeeds parsing '(', runs the parser recursively and binds the result to n.
    • Tries the parser in the do block, fails parsing '(', tries the next parser (return 0) which always succeeds with the value 0.
  • n теперь имеет значение 0, потому что это результат рекурсивного запуска синтаксического анализатора. Далее в блоке do находится синтаксический анализатор char ')', он завершается успешно, снова рекурсивно вызывает синтаксический анализатор и привязывает результат к m. Как и выше, результат в m равен 0.

Теперь весь результат вычислений равен max (n+1) m, что равно 1.

Как вы можете видеть, это анализирует вложенные скобки, и примерно на верхнем уровне n содержит количество проанализированных '(', а m содержит количество проанализированных ')'.

person edon    schedule 23.03.2011