モナド (プログラミング)
関数コモナドは型 T {\displaystyle T} を関数型 M → T {\displaystyle M\rightarrow T} にうつす。ここで、 M {\displaystyle M} はモノイド構造を持つ型である。コモナド演算は
extract : ( M → T ) → T = f ↦ f ε {\displaystyle {\text{extract}}:(M\rightarrow T)\rightarrow T=f\mapsto f\,\varepsilon }
extend : ( ( M → A ) → B ) → ( M → A ) → M → B = f ↦ g ↦ m ↦ f ( m ′ ↦ g ( m ∗ m ′ ) ) {\displaystyle {\text{extend}}:((M\rightarrow A)\rightarrow B)\rightarrow (M\rightarrow A)\rightarrow M\rightarrow B=f\mapsto g\mapsto m\mapsto f\,(m'\mapsto g\,(m*m'))}
unit関数( return とも)は型 x の引数を型 M x の返り値にうつす関数である。すなわちunit 関数は型 x の値をモナド型 M x の値へうつす多相な関数である。引数値変換の有無は定義されない(一般には値を変換せずに保持する(例:入力 1 =>出力 Maybe(1))。
三つ組 {M, unit(return), bind(>>=)} をモナドと成す規則をモナド則という。以下がモナド則である。
return は >>= に対して、ほとんど単位元である。 (return x) >>= f ≡ f x m >>= return ≡ m
ふたつの関数を続けて bind するのは、これらの関数から決まるひとつの関数を bind することに等しい。 (m >>= f) >>= g ≡ m >>= ( \x -> (f x >>= g) )
公理を do 記法で表現することもできる。
do { f x } ≡ do { v <- return x; f v }
do { m } ≡ do { v <- m; return v }
do { x <- m; y <- f x; g y } ≡ do { y <- do { x <- m; f x }; g y }
また、モナド合成演算子
を使うと
return >=> g ≡ g
f >=> return ≡ f
(f >=> g) >=> h ≡ f >=> (g >=> h)