lethevert is a programmer このページをアンテナに追加 RSSフィード

5/9/2006 (Tue) 晴れ

[]Haskell : モナドはややこしい

私の頭ではついていけません!

Concurrent Cleanの世界が性にあっている気がする。

というのは、まあ、アレなのですが、IO回りの実装はCleanよりもややこしそうで、その分、処理系を作るのは大変そうな気がしました。

酒井酒井 2006/09/06 20:40 なんだか、評価順序のような重要で無い細部にこだわって、自縄自縛におちいってませんか。私の感覚が麻痺してるのかも知れませんが、モナドが一意型に比べてそんなにややこしいは思えないです。

それと、実装については、もしCleanのIO周りが実装可能であるなら、HaskellのIO型は「IO a = *World -> (a, *World)」とでも定義すれば良いだけなので、Clean以上に複雑になることはないと思います。

lethevertlethevert 2006/09/07 09:05 Haskellの実装が大変といっても、効率のいい実装が思いつかないというくらいのことなので、一度ソースを読んで自分で作ってみれば納得することだと思います。

Cleanの場合、一意型だけでなく正格性注釈を組み合わせることで、Cleanの言語表面の機能でIOの順序が決められているのにたいし、Haskellの場合、(一連の話で理解したのは)モナドは一意型の機能しか持っていなくて、正格性注釈にあたる部分はモナドの実装(bindの実装)に依っているところが、納得しづらいというか、

Haskellで自分で新たに別のIOライブラリを作る場合にどういうところに注意して実装すればいいのかというところが分かりにくいのが気持ち悪い感じです。

あと、これは私の修行が足りないせいかもしれないですが、IOのように副作用に意味があって、その実行順序が重要な場合には、評価順序がどうなるのかはやはり重要な気がします。

酒井酒井 2006/09/07 19:44 利用者の視点で観念的な話をするなら、Haskellには副作用は存在しないし、IOモナドそれ自体にも副作用は無いですよ。
Haskellの「言語」上でIOモナドの果たす役割は「IOアクション(の意図)を順序などの構造を持った値として表現する」ことだけであり、外界に影響を及ぼすのは「外の世界(=処理系)がIOモナドの値をそのように解釈/実行しているから」に過ぎません。
そして、外の世界がIOモナドの値を使うから、そのために必要な部分が順に評価されるのであって、「評価順序に従って実行される」のではないはずです。

もちろん実装者は、IOアクションの表現に処理系にとって扱いやすい形のものを選ぶことが出来、例えば評価順序+副作用を利用して順序を表現しても構わないですが、それらはあくまで実装テクニックであって本質ではないと思うんですよ。

結局、HaskellのIOライブラリを実装する際に注意すべきなのは、私の意見では「ユーザからは参照透明に見えること」「モナド則を満たすこと」「IOアクションの順序が表現可能であること」くらいではないかと思います。

正確性注釈についてはまた後ほど。

lethevertlethevert 2006/09/07 22:13 まず、モナドの件に関しては、投了です。Haskellの考え方がそういうものであることは納得しましたし、当初の考えが間違っていたことも納得しました。

実行順序(今回は、評価ではない)については、言語表面の機能として何らかの制御が表現できないと、常に他の言語で書かれたライブラリを利用しなければ、IOのような順序が重要な操作を定義できないので、言語として不完全なのではないかと思うのですが、これまたHaskellをよく理解していないので、これ以上突っ込んでも私のほうからは有益な情報は何も提供できないような気がします。ので、こちらも投了です。

えっと、ちなみにjust ideaですが、一連の話の中で、モナドをリストのようなものだと見て、それを食わせれば順番に実行してくれるプリミティブがあればいいだけかなというイメージが生まれてきていて、それはHaskellの遅延評価の仕組みによって、効率的に実行されそうな気がしています。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

 
Connection: close