#blognavi
#blognavi
ここ数日のモナドのどたばたで得た
結論めいたものをちょっとまとめておきます。
結論めいたものをちょっとまとめておきます。
- Haskellの演算子(>>=)は、実質的には圏論のモナド(M, ext, unit)の ext(拡張)そのものである。
- ただし、2項演算子として使いやすいようにextの第一引数と第二引数を入れ替えてある。
つまり
ext = (flip (>>=)) = (=<<) --flip f a b = f b a
なわけでした。
当初
m >>= f = (ext f) $ m
と捉えていたせいで「ext になぜ関数適用($)がくっついているんだろう。」と疑問でしたが,
(>>=) m f = ext f m
と書けば、単に引数が逆なだけだったのでした。
以下ちょっと蛇足?
f3( f2( f1 ) )
という式があってこれをモナドで拡張すると、
(ext f3') ( (ext f2') ( f1' ) ) --ただしf1'はf1のモナド版
これをHaskellの中置演算子記法で変形すると
f3' `ext` f2' `ext` f1'
と右→左の順番になります。
もとのf3( f2( f1 ) )をあらわす関数結合が f3.f2.f1ですから当然なのかも知れませんが。
もとのf3( f2( f1 ) )をあらわす関数結合が f3.f2.f1ですから当然なのかも知れませんが。
ただ、Haskellを作った人はたぶん「これはちょっと不便だ」と考えて、
原義の ext の引数の順序を入れ替えて(>>=)を作ったのでしょう。
原義の ext の引数の順序を入れ替えて(>>=)を作ったのでしょう。
f1' >>= f2' >>= f3'
そのお陰でいま私たちはIO処理を
普段文章を読むのと同じ順序・方向で書けるわけなのでした。
普段文章を読むのと同じ順序・方向で書けるわけなのでした。
(すでに檜山さんのところのコメント欄や酒井さんやブクマなどで散々指摘されてきた内容が
私の脳にしみこむのにここまでかかってしまいました。)
私の脳にしみこむのにここまでかかってしまいました。)
カテゴリ: [プログラミング] - &trackback() - 2006年04月21日 15:00:13