パーサ

モナドってずうっと、わかりそうでワカラン、だったんだけどパーサの結合の説明読んでて急に理解できました。しかし今度はなんでこんな方法を考えつくのかがワカラン(^^;)*1
結局最終目標はfunc1 から funcnまでを順に変数代入みたいなことして、何らかの関数に食わせたい。

 p = do v1 <- func1
        v2 <- func2
       :
        return (f v1 v2 ....)

まずは >>= ("then"と読むそうです)を定義。

 f >>= g = \inp -> case (f inp) of
                  終了条件 -> 終了値 -- あってもなくても良い、。。のかな
                  パターン -> (g <取り出した値>) <次に処理する値>

この(g <取り出した値>) ... (*)のところが肝なのですね(ここが全然理解できてなかった)。

利用時はこんなふうな構造になります(私の脳キャパを超えるのでまずは非常に端折って書きます)。

 func1 >>= (\v1 -> func2 <ごちゃごちゃ>)

gを上のようにλ式として書く。すると, (*)で v1 が <取り出した値>に束縛され、次のfunc2 <ごちゃごちゃ> 以降が評価される。

さて続きで、<ごちゃごちゃ>まで書いてみると、、、

 func1 >>= (\v1 -> func2 >>= (\v2 -> ... >>= return (f v1 v2 ....))..)

同様にv2に次の値が束縛され、次のfuncが評価され、v3が。。。。。と続きます。この結果、(do文で言うところの)各行のところで、それより前の行の結果が λ式の入力として見える。しかも実行順序は関数の適用順で守られる。最後のreturnの所では全変数が見える訳っすね。ううん。ウマスギです。

んで、、do 構文は上記の式のsyntax sugarなのか。


実は簡単な事なのかもしんないけど、やっぱ私にはむずかしぃ。()つけないと脳が沸騰してしまいそうです。


間違ってたらお叱りください>識者様

*1:宇宙人だよ..マジで