Hatena::ブログ(Diary)

sshi.Continual このページをアンテナに追加 RSSフィード

プロフィール

sshi

SFと映画と小説とRuby信者(最近はhaskellびいき)です。

 | 

2006-09-05 Tue

[]モナドの実行順 モナドの実行順を含むブックマーク

http://d.hatena.ne.jp/sshi/20060903/p3

勉強会で出た話題を書き散らしたら、いろんな人からトラックバックを貰えて嬉しい限りでありますが、今余裕がないのでちゃんと反応できてません。ごめんなさい。

結論としては、モナドの仕組み自体は実行順を規定しておらず、MaybeモナドやIOモナドが実行順を制御した(のと同等の)結果を得られるのは、個々のモナド実装がうまいことできてるから、ということでいいのかな。ただ、モナドの型定義がどれくらいその「うまいこと」に寄与しているのかはまだよくわからず(多分、http://d.hatena.ne.jp/lethevert/20060904/p1 のあたりの話はそういう話なんだと思う)。

モナドを使わずに、例えばMaybeモナドStateモナドと同等の(つまり、実行順というか命令並び順に依存する結果を出す)ことをするhaskellコードと、モナドの型には沿っているものの命令並び順で同じ結果を出すコードを書ければ、モナドの働きとモナドモナド則の限界(というか実体)が理解できるかなあ。というか、それ自分でやってみないと理解できる気がしない。余裕できたら書こう。

k.inabak.inaba 2006/09/09 02:21 「実行順を制御した(のと同等の)」というのが実はよくわからなくて…。

Stateモナドでdo{put 1;put 2;get}とdo{put 2;put 1;get}が違う値になる、というようなことを指しておられるのでしょうか。だとするとそれは、get (put 2 (put 1 s)) と get (put 1 (put 2 s)) が違う値になるのと完全に同じ話なので、当たり前な話に思えてしまいます。

do{put 1;put2;get} が get (put 2 (put 1 s)) という中から外への関数適用の形と対応することそれ自体を指しておられるのであれば、それはモナド則でも個々のbindの定義でもなく、m a->(a->m b)->m bという型が理由だと思います。

k.inabak.inaba 2006/09/09 02:34 lethevertさんのとこでは「f (g (h x)) の形になるからと言って、h→g→fの順にHaskellプログラムが評価されるとは限らない」と議論したのですが、「f (g (h x))の形になるなら、gの結果は他に依存してるとすればfじゃなくてh」は言えます。

sshisshi 2006/09/09 03:21 コメントありがとうございます。
> 「実行順を制御した(のと同等の)」というのが実はよくわからなくて…。
すいません。僕も自分の疑問が良くわからなくなってきました。モナドに関するいろんな方の関連した話題はいちいち納得できます。それぞれについて全く異論ありません。
僕の中でひっかかってるところは「モナドの型定義とモナド則が、各モナドの実装にどれくらいの制約として働いているのか」というところです。逆にいうと「モナドの型定義とモナド則を満たしているかぎり、個々の実装で実現できないような関数があるのか?あるならそれはどういうものか」ということになるでしょうか。その境界を知りたいなあと思っているわけです。…多分。
自分の中で問題設定がブレてるというか、複数の要因をいっしょくたにして悩んでる気はしているので、コメントしてくださった
>「m a->(a->m b)->m bという型が理由」
>「f (g (h x))の形になるなら、gの結果は他に依存してるとすればfじゃなくてh」
のあたりを落ちついて整理してみます。

トラックバック - http://d.hatena.ne.jp/sshi/20060905/p1
 | 

あわせて読みたい
sshi.Continual 909408 なかのひと RSS feed meter for http://d.hatena.ne.jp/sshi/