モナド (プログラミング)
環境モナド(Readerモナドや関数モナドとも呼ばれる)は環境を共有した計算を可能にする。型構築子は型 T を 関数型 E → T にうつす。ここで、E は共有したい環境の型である。モナド演算子は
return : T → E → T = t ↦ e ↦ t {\displaystyle {\text{return}}\colon T\rightarrow E\rightarrow T=t\mapsto e\mapsto t}
bind : ( E → T ) → ( T → E → T ′ ) → E → T ′ = r ↦ f ↦ e ↦ f ( r e ) e {\displaystyle {\text{bind}}\colon (E\rightarrow T)\rightarrow (T\rightarrow E\rightarrow T')\rightarrow E\rightarrow T'=r\mapsto f\mapsto e\mapsto f\,(r\,e)\,e}
もっとも単純なモナドは恒等モナドであり、値になんの情報も付加しない。
このモナドのdoブロックは変数の代入を実行する。例えば、do {x <- 2; return (3*x)} の結果は6である。
圏論的な見方をすると、恒等モナドは恒等函手の間の随伴から得られる。
リストや集合や多重集合といった、おなじみのコレクション型にもモナドであるものがある。リストの場合の定義は次のようになる。
リスト内包記法(英語版)はリストモナドに固有のもので、例えば、リスト内包 [ 2*x | x <- [1..n], isOkay x] はリストモナドでの計算 do {x <- [1..n]; if isOkay x then return (2*x) else mzero;} に対応している。
リスト内包記法は集合の内包記法に似ているが、集合はモナドにならない。なぜなら、計算の型は等しいかどうかを比較可能でなければならない — モナドは計算の型についてこれを課していないように見えるにもかかわらず — という制限があるからである。実際、集合は制限されたモナド(restricted monad)である。コレクションによるモナドは非決定計算を自然に表現する。リスト(または他のコレクション)は非決定的な計算の異なった実行パスが今の時点で取りうる結果の全体を表す。例えば、x <- [1,2,3,4,5] を実行したとすると、変数 x はこのリストから非決定的に選ばれた値であるとみなしている。xを返すことは、各実行パスの結果を値のリストにまとめることを意味する。さらに、bind 演算子では今の可能な結果に対して関数 f を実行し、それぞれの結果をひとつのリストに結合する。
モナドは、元となる型システムが与えられたとき、その内部に対応する型システム(モナド的型システムと呼ぶ)を埋め込む構成である(つまり、各モナド的型は元のシステムの型でもある)。このモナド的型システムは元の型システムの重要な点は全て保存するが、モナドに固有の特徴を追加する。
モナドは複数の方法で定義できる。そのうちの1つは「モナドとは、ある法則(モナド則)を満たす三つ組みである」 で表される定義である。すなわち圏論のクライスリ圏におけるクライスリトリプルである。