このブログの一連の記事で、やっと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 型」の関数だ。全ての、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)
|
カテゴリ
新型コロナウイルス 主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude Ocaml ボーカロイド 圏論 jQuery デモ HTML Python ツールボックス XAMPP Ruby ubuntu WordPress 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker ed と sed HTML Raspberry Pi C 言語 命題論理 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||