モナド (プログラミング)
恒等コモナドはもっとも単純なコモナドであり、型 T をそれ自身にうつす。extractは恒等関数であり、extendは関数適用である。
状態モナドは状態を付加した計算の型である。好きな型に対して、その型を状態として持つ状態モナドを作ることができる。これは状態を引数に取り、通常の返り値(型 t の値)と新しい状態(型 s の値)を返す関数である。
今までに見たモナドと違い、状態の型という型引数を取ることに注意しよう。モナドの演算は次のように定義される。
状態を操作する関数を挙げる。
初期状態を指定して状態モナドを実行する関数。
状態モナドのdoブロック内の計算は状態の確認や更新を行うことができる。
非形式的に書くと、状態の型 S を持つ状態モナドは返り値の型 T を関数型 S → T × S {\displaystyle S\rightarrow T\times S} に変換する。return は単に
return : T → S → T × S = t ↦ s ↦ ( t , s ) {\displaystyle {\text{return}}\colon T\rightarrow S\rightarrow T\times S=t\mapsto s\mapsto (t,s)}
Writerモナドは本来の計算を行いながら、様々な種類の追加の出力を作成することができる計算である。ログ取りやプロファイリングに有用である。元の型 T に対して、Writerモナドは型 W × T の値を持つ。ここで、W はモノイド則を満たす演算を持った型である。すなわち、W は二項演算子 (a,b) → a*b と単位元 ε を持っており、これは結合則 (a*b)*c = a*(b*c) を満たし、任意の x について、x*ε = ε*x = x を満たす。
モナド演算は
return : T → W × T = t ↦ ( ε , t ) {\displaystyle {\text{return}}\colon T\rightarrow W\times T=t\mapsto (\epsilon ,t)}
bind : ( W × T ) → ( T → W × T ′ ) → W × T ′ = ( w , t ) ↦ f ↦ ( w ∗ w ′ , t ′ ) where ( w ′ , t ′ ) = f t {\displaystyle {\text{bind}}\colon (W\times T)\rightarrow (T\rightarrow W\times T')\rightarrow W\times T'=(w,t)\mapsto f\mapsto (w*w',\,t')\quad {\text{where}}\;(w',t')=f\,t}
duplicate の型は W T → W (W T) であり、次の規則を満たす。
extract ∘ duplicate = id {\displaystyle {\text{extract}}\circ {\text{duplicate}}={\text{id}}}
fmap extract ∘ duplicate = id {\displaystyle {\text{fmap}}\,{\text{extract}}\circ {\text{duplicate}}={\text{id}}}
duplicate ∘ duplicate = fmap duplicate ∘ duplicate {\displaystyle {\text{duplicate}}\circ {\text{duplicate}}={\text{fmap}}\,{\text{duplicate}}\circ {\text{duplicate}}}
ふたつの定式化の関係は
fmap : ( A → B ) → W A → W B = f ↦ extend ( f ∘ extract ) {\displaystyle {\text{fmap}}:(A\rightarrow B)\rightarrow \mathrm {W} \,A\rightarrow \mathrm {W} \,B=f\mapsto {\text{extend}}\,(f\circ {\text{extract}})}