モナド (プログラミング)
で定義される。ここで、εと * はモノイド W の単位元と二項演算子である。
JavaScriptではWriterモナドの値として2要素の配列を使うことができる。最初の要素は任意の値であり、二番目の要素は出力を貯めておくための配列である。
角括弧はこのモナドの値コンストラクタとして使っていて、より単純な要素(配列の0番目は値、1番目にはログ配列)からWriterモナドの値を作っている。
unit (return はJavaScriptの予約語なのでこちらを使う)は元の値に空のログ配列をつけるだけである。
bind は最初のWriterモナドの中の値に関数を適用し、それぞれのログ配列を結合して新しいモナドの値として返す。
pipelineは補助関数で関数の配列を順番に bind する。
モナドの値を返す関数の例を挙げる。
最後に数学関数のパイプラインにデバッグ情報(デバッグ情報の配列は結合されて、値と一緒に返される)を追加する例を挙げる。
加法的モナドは、モノイド則を満たす二項演算子 mplusとその単位元としてモナド的な値 mzero を備えたモナドである。演算子 mplus の型は M t → M t → M t であり(ここで、M はモナドの構築子であり t は元の型である)、結合律と左右からの単位元律を満たす。
このことから、加法的モナドはモノイドでもある。>>=に対しては、mzeroはヌル要素として振舞う。ゼロを掛けるとゼロになるように、mzero と関数を bind すると結果はゼロとなる。
同様に、モナド的な値 m とつねにゼロを返す関数を bind すると、結果はゼロである。
直観的には、モナド的値としてのゼロはモナドに関連した構造だけを持ち元の型の値を持たない。Maybe モナドでは、「Nothing」がゼロである。リストモナドでは、空リストがゼロである。
型構築子Mは、ある型 x から派生した型を得る方法を定める。得られる型はしばしば M x で表記される。
fmap : ( A → B ) → ( C × A ) → ( C × B ) = ( c , a ) ↦ ( c , f a ) {\displaystyle {\text{fmap}}:(A\rightarrow B)\rightarrow (C\times A)\rightarrow (C\times B)=(c,a)\mapsto (c,f\,a)}
duplicate : ( C × A ) → ( C × ( C × A ) ) = ( c , a ) ↦ ( c , ( c , a ) ) {\displaystyle {\text{duplicate}}:(C\times A)\rightarrow (C\times (C\times A))=(c,a)\mapsto (c,(c,a))}
で定める。