人気ブログランキング | 話題のタグを見る

IOモナドのイメージ

このブログの一連の記事で、やっとIOモナドのイメージについてきちんと語ることができるようになった気がする。

ひとことで言うと、IOモナドとは、Haskell という圏の世界をそれ自身の中に映しだす自己関手というビデオカメラのようなものだということだ(正確には、型構築子(自己関手) IO と 単位元 unit と 乗法 multiplication の3つ組をIOモナドと言うが、Haskell のIOモナドは、IOモナドそのものではなく、IOモナドから派生するIOモナドの Kleisli 圏を操作する。IOモナドの Kleisli 圏は、型構築子(自己関手)IO と関数 return と 演算子 >>= の3つ組からなる。)。そうして、このIOモナド(自己関手)によって映し出されたHaskell の像をIO モナド圏とよぶことにすると、この IO モナド圏は、カプセル化されたブラックホールのような圏の世界になる。

そうして、IOモナド圏の世界を外界からコントロールするためには、「変数が一個で、戻値が IO a 型」という唯一の形式の関数(IOモナドの Kleisli 圏の関数)と、retrun と >>= という2つの関数を使う以外方法がない。これらを使って IO モナド圏を操作する方法は、次の3つの方法に限る。その3つの方法とは次のようなものだ。
ルール1: IOモナド圏のプログラムは、IOモナド(の Kleisli 圏)型の関数を >>= 演算子で結合した、IOモナド型の関数である。ここで言うIOモナド型の関数とはIOモナド圏の関数ではなく「Haskell圏の引数が1個で、戻値が IO a 型」の関数だ。

ルール2: >>= 演算子の左辺からの戻値が無いときは >> 演算子を使う。

ルール3: 変数を使いたいときは >>= 演算子の右辺の式をラムダ記法で記述する。
全ての、IO モナド圏のプログラムは、この3つの方法のどれかを使わなければ操作することができない。

圏の世界とは、対象というデータと、そのデータの間の関係である射で出来上がっている世界だ。RPGの世界を探索するときのように、Haskell のプログラマはデータと関数を操作することで、Haskell という圏の世界をコントロールする。プログラムをデータと関数だけでコントロールするというと難しそうに聞こえるが、Haskell を ghci や Hugs のコマンドラインから操作してみると、そう難しいものではない。

また、IO モナド圏の世界も同じだ。IOモナド圏の世界をコントロールするのも、IO モナド圏の世界のデータと関数を操作することで行われる。しかし、IOモナド圏の世界は、Haskell の世界とは別世界に隔絶されており、その世界のデータと関数をリモートコントロールする方法は、「引数が1個で、戻値がIO a型」の関数と、return と >>= という、IOモナド圏の世界と Haskell の世界を結びつける小さなチャンネルを活用するほか方法はない。

こういうイメージで IO モナドのプログラムに対処すれば、IO モナド圏というブラックホールに閉じ込めたデータが外界に全く影響を与えず、また、上に述べた3つのルールを守るだけで、簡単に副作用を IO モナド圏の世界に閉じ込めることができるのがうれしくなるだろう。

ネットゲームの世界をコントロールするには、ゲームの操作法のルールに従わなければならない。同じイメージで IO モナドの圏の世界も、上に述べた3つのルールで完全に操作できるのだ。


このブログ内の関連記事

Haskell 圏 IOモナド IOモナド圏
Haskell 記事リストのまとめ
IO モナドとの付き合い方(1)

圏論を使わないIOモナドの操作法

IOモナドの正体
>>= 演算子と do 記法
IOモナドの >> 演算子
普通の関数をIOモナドに変える
複数の引数を持つIOモナド
IOモナドとHaskell の最も単純なイメージ
do 記法を使わない main 関数
IO モナドのループの書き方
IOモナドの再帰関数の注意点
by tnomura9 | 2011-10-14 07:14 | Haskell | Comments(0)
<< IO モナドのループの書き方 自明なモナド >>