1

私は初心者の Haskell であり、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 より大きいのはなぜですか?

4

1 に答える 1

3

Parsec はモナド構文解析ライブラリであるため、最初にモナドと do 表記である構文糖衣について紹介する必要があります。

nestingtype の結果を持つ計算 (モナド) として見ることができるパーサーですInt。do ブロックでこのようなコードを見るときはいつでもn <- nesting、モナドのネストを実行し、結果を にバインドすることを意味しnます。

このパーサーがどのように機能するかを確認するには、手動で実行してみてください。たとえば、文字列 " ()" を使用します。

こんなふうになります:

  • do ブロックでパーサーを試行し、' (' の解析に成功し、パーサーを再帰的に実行して、結果を にバインドしnます。
    • do ブロックでパーサーを試行し、' ' の解析に失敗し、値 で常に成功する(次のパーサー ( ) を試行します。return 00
  • nこれは、パーサーを再帰的に実行した結果であるためです。do ブロックの次はパーサーchar ')'で、成功し、パーサーを再帰的に呼び出して、結果を にバインドしmます。上記と同じで、結果はmです0

これで、計算の全体の結果はmax (n+1) mwhich is1です。

ご覧のとおり、これはネストされた括弧を解析し、ほぼ最上位レベルn'('解析されmた数を保持し、')'解析された数を保持します。

于 2011-03-23T10:07:59.333 に答える