モナド (プログラミング)
で定義される。
環境を操作する関数として
ask : E → E = id E {\displaystyle {\text{ask}}\colon E\rightarrow E={\text{id}}_{E}}
local : ( E → E ) → ( E → T ) → E → T = f ↦ c ↦ e ↦ c ( f e ) {\displaystyle {\text{local}}\colon (E\rightarrow E)\rightarrow (E\rightarrow T)\rightarrow E\rightarrow T=f\mapsto c\mapsto e\mapsto c\,(f\,e)}
がある。ask は現在の環境を取得するのに使う。localは指定した計算を一時的に変更した環境で行う。状態モナドと同様に、環境モナドによる計算は単に環境の値にモナドの値を適用することで実行できる。
bind関数( >>= とも)は「モナド的値」と「値をモナド的値へうつす関数」を引数にとり、第1引数のモナド的値を第2引数関数の値域へうつす。
積コモナドは型 T {\displaystyle T} を積の型 C × T {\displaystyle C\times T} にうつす。ここで C {\displaystyle C} はコモナドの文脈の型である。コモナド演算は
extract : ( C × T ) → T = ( c , t ) ↦ t {\displaystyle {\text{extract}}:(C\times T)\rightarrow T=(c,t)\mapsto t}
extend : ( ( C × A ) → B ) → C × A → C × B = f ↦ ( c , a ) ↦ ( c , f ( c , a ) ) {\displaystyle {\text{extend}}:((C\times A)\rightarrow B)\rightarrow C\times A\rightarrow C\times B=f\mapsto (c,a)\mapsto (c,f\,(c,a))}
余状態コモナドは型 T {\displaystyle T} を型 ( S → T ) × S {\displaystyle (S\rightarrow T)\times S} にうつす。ここで S はストアの型である。コモナド演算は
extract : ( ( S → T ) × S ) → T = ( f , s ) ↦ f s {\displaystyle {\text{extract}}:((S\rightarrow T)\times S)\rightarrow T=(f,s)\mapsto f\,s}
extend : ( ( ( S → A ) × S ) → B ) → ( ( S → A ) × S ) → ( S → B ) × S {\displaystyle {\text{extend}}:(((S\rightarrow A)\times S)\rightarrow B)\rightarrow ((S\rightarrow A)\times S)\rightarrow (S\rightarrow B)\times S\,} = f ↦ ( g , s ) ↦ ( ( s ′ ↦ f ( g , s ′ ) ) , s ) {\displaystyle =f\mapsto (g,s)\mapsto ((s'\mapsto f\,(g,s')),s)}
プログラム言語Haskellはモナドを多用する関数型の言語であり、簡単にモナドの合成ができるような構文糖衣を持っている。特に指定がない限り、この記事のコード例はHaskellで書かれている。
モナドの紹介として一般的なふたつの例 Maybe モナドと I/O モナドを取り上げる。もちろん、モナドはHaskellに限られたものではないので、JavaScriptでの Writer モナドの例もその次に扱う。