モナド
を少々勉強、Haskellとやらは知らぬ。
他にやりたい・やるべきことがあるのに…全くもって現実逃避。
以下、対象、射、関手、自然変換とはいわずに、型、プログラム、型コンストラクタ、多相型関数としてる。
■問題点
型 、、 に関するプログラム と があるとき、プログラムの合成 は型 のデータ に対して とすれば良い。
ここで にリスト化や外部出力などの何らかの付随計算をさせる場合ことを考える。
そのような計算を付加した時の出力型を 、 とし、出力を拡張したプログラムを 、 とすると、 の出力と の入力の型が異なるので、 に対応する拡張プログラム は と の単純な合成では表せない。
■解決策
を型 に対して型 を生成する型コンストラクタとし、プログラム が与えられると、 を元に具体的なプログラム が生成されるものとする。
そしてこの型コンストラクタ に対して、2つの多相型関数を用意する。
次の計算で混乱しないように、幾つかの具体的な に対して、プログラムの型を明確にしておく。
そしてこの2関数が次の性質をもつとき、三つ組 をモナドと呼ぶ。
- 型 のデータ に対して、
- 型 のデータ に対して、
- プログラム と、型 のデータ に対して、
- プログラム と、型 のデータ に対して、
ここで、2つのプログラムを定義する。
- を、 で定める
- … から型 のデータを取出し、プログラム を適用する
- を、 と定める
- … を型 へ詰込む
このとき、 は で与えられる。
さらに上の4つの性質から、最低限なりたってて欲しい次の3つの性質が導ける。
- … 詰込んだ を取出して を適用するのと、直接 に を適用するのは同じ
- … 取出して詰込み直したものは、元と同じ
- … の結果は計算順に依らない
■例
は後日としておく。
*1:>>=)(M, f), g)=(>>=)(M, (>>=)(f, g