もなもなモナド

haskellモナドの解説は、「Haskellの入出力」というページ(http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/haskell_io.html)がめちゃくちゃわかりやすい。やっぱり、いきなりdo記法からはいるのは、袋小路につっこんでいくだけだよな。do記法なんて一番最後でいいんだ。うん。

モナドに悪戦苦闘中な自分の感想からいえば、「haskellモナドを使って入出力と参照透明性を両立させている!すげえ」みたいなセリフを真に受けて、IOモナドだけつまみ食いしようとしても駄目なんだよな。でも、よくある入門やらサンプルコードを見ると、いきなりdo記法でputCharとかやられるもんだから、モナドが持つメタパターン的構造をすっとばして、「あ、実行順を制約したい時はこんな記法でこう書くのか」と迂闊に理解して終わってしまう。
これ良くないゼッタイダメ。後で、IOじゃないMaybeモナドとか、do記法じゃない生の>>とか>>=とかがでてきて、何がなにやらわけがわからなくなって、すべては混沌につなぎとめられてしまう。
モナドっていうのは、いわばパターンのパターン、メタパターンであって、もともと何か意味のあるもんじゃない。強いて意味を求めるとしたら「何かを包みこみ、その包みを繋げられるもの」というくらいの抽象的な意味か、さらにめちゃくちゃ抽象的なモナド則(http://www.sampou.org/haskell/a-a-monads/html/laws.html)くらいしかない。だからここはあんまり気にしないで「モナド」というのは要は、>>=とreturnという演算子を持つちょー抽象的なメタパターンであるという事だけ認識しておくのが最初の一歩。それらしい意味はメタパターンを一歩具体化した、IOモナドやらMaybeモナドやらの個々のモナドになってはじめてでてくる。IOモナドは"動作"を表現するデータ型であり、Maybeモナドなら失敗も許容するデータ型である、という具合。
モナドを学び始める時は抽象的なままじゃわけわかんないので、IOモナドでもMaybeモナドでも実例を見て学ぶしかないんだけど、その時も「これはメタパターンの具体的な用法のうちの一つなんだ」ということを頭の片隅に置いておこう。モナドのメタパターンな性質は>>=とreturnに全て込められているので、それをそのまま使う例を見てその感覚に慣れよう。でもって、具体的なモナドの用法の向こう側に、メタパターンが透けて見えてきたら、恐る恐るdo記法へいく。ここで飛びついてはだめ。最初はうさんくささを感じないとだめ。それから最後にモナド則をもう一度見て、do記法の一貫性を確認して安心しよう。そこまで来ればもうこっちのもので、あとは個々のモナドの意味を理解していけばいい。
今の僕の理解では、モナドはこの順番で学ぶのが一番習得が早いんじゃないかと思うんだけど、どうだろう。最初に紹介した「haskellの入出力」というページでは、「haskellでの入出力の扱い」という辺りから、(モナド則以外を)この順番に解説してくれるのでとてもわかりやすい。お勧め。
あれ、なんかこれ書いたらモナドが理解できたような気になったぞ。いいのか?