モナドの分類


モナド型クラスに属する型はいろいろとあって、その中にはさらにMonadPlusをサポートするモナド型があったり、そうでないものがあったりするわけで、これはつまりいろいろなモナド型を2種類に分類しているわけですよね…

IO (Maybe a)という型のモナドのコードを書いていて、どうやらモナドのもうひとつの分類法があることに気がつきました(というほどすごいことではないんですが)。
その分類方法というのはつまり、そのモナド型が関数を内包しているかしていないかというものです。分類してみるとState、IO、Reader、Writer(たぶん)なんかは関数を内包しているモナド型で、リストやMaybeなんかはそうではないタイプのモナド型といった感じになります。でも、これはMonadPlusのように別の型クラスに表現できるようではなさそげです。


それで、いったいこれがどうゆう影響を及ぼすかというと、関数内包型のモナドは重ね合わせるのが結構めんどくさいということです。[Maybe a]とかMaybe [a]なんかは結構単純にできちゃうと思うんですが、IO (Maybe a)とか、IO(State a)とかは結構ややこしいことになってきます。逆にMaybe(IO a)なんかはそんなに酷いことにはなりませんな…でもState (IO a)はやっぱり大変かも…

それじゃあIO (Maybe a)は大変だからMaybe (IO a)にしようとか言ってみると、意味的には微妙な違いがありそうですね…僕がやろうとしていたことにはどっちでも使えそうなんですが、まだ試してません。

今日はつぶやき系でした…
ではでは。