Parsec はモナド構文解析ライブラリであるため、最初にモナドと do 表記である構文糖衣について紹介する必要があります。
nesting
type の結果を持つ計算 (モナド) として見ることができるパーサーですInt
。do ブロックでこのようなコードを見るときはいつでもn <- nesting
、モナドのネストを実行し、結果を にバインドすることを意味しn
ます。
このパーサーがどのように機能するかを確認するには、手動で実行してみてください。たとえば、文字列 " ()
" を使用します。
こんなふうになります:
- do ブロックでパーサーを試行し、'
(
' の解析に成功し、パーサーを再帰的に実行して、結果を にバインドしn
ます。
- do ブロックでパーサーを試行し、' ' の解析に失敗し、値 で常に成功する
(
次のパーサー ( ) を試行します。return 0
0
n
これは、パーサーを再帰的に実行した結果であるためです。do ブロックの次はパーサーchar ')'
で、成功し、パーサーを再帰的に呼び出して、結果を にバインドしm
ます。上記と同じで、結果はm
です0
。
これで、計算の全体の結果はmax (n+1) m
which is1
です。
ご覧のとおり、これはネストされた括弧を解析し、ほぼ最上位レベルn
で'('
解析されm
た数を保持し、')'
解析された数を保持します。