モナド (プログラミング)
自由モナドは自由モノイドと似ていて、直観的には、使う型に依存せずにモナド則(またはモノイド則)を満たすようにできる汎用の構造である。
型 t に対して、t の自由モノイドは [t] であり、結合的な二項演算子として ++、単位元として [] を選ぶ。Haskellでは以下のように書ける。
具体的なモノイドとでは、値 t1,t2,...,tn を二項演算で足すことができるが、[] では単に、結合 [t1,t2,...,tn] になるだけであり、単に「一緒に集めた」だけである。ここで、「一緒に集めた」結果がどうなるべきかは定めない。
自由モナドも同じ考えに基づいて定義される。上の定義 List t = Nil | Cons t (List t) に函手を挿入することで、次の定義を得る。
List が値のリストを保存するのと違って、Free はドメインの値を決めた函手のリストを保存する。Free の Functor と Monad インスタンスの定義によると、受け取った関数を fmap でリストに落としているだけしかしていないことが分かる。
結果の型 R {\displaystyle R} の継続モナドは型 T {\displaystyle T} を関数型 ( T → R ) → R {\displaystyle \left(T\rightarrow R\right)\rightarrow R} にうつす。これは継続渡しスタイルのモデルとして使われる。return と bind 関数の定義は
return : T → ( T → R ) → R = t ↦ f ↦ f t {\displaystyle {\text{return}}\colon T\rightarrow \left(T\rightarrow R\right)\rightarrow R=t\mapsto f\mapsto f\,t}
bind : ( ( T → R ) → R ) → ( T → ( T ′ → R ) → R ) → ( T ′ → R ) → R {\displaystyle {\text{bind}}\colon \left(\left(T\rightarrow R\right)\rightarrow R\right)\rightarrow \left(T\rightarrow \left(T'\rightarrow R\right)\rightarrow R\right)\rightarrow \left(T'\rightarrow R\right)\rightarrow R} = c ↦ f ↦ k ↦ c ( t ↦ f t k ) {\displaystyle =c\mapsto f\mapsto k\mapsto c\,\left(t\mapsto f\,t\,k\right)}
であり、bind は
bind : ( S → T × S ) → ( T → S → T ′ × S ) → S → T ′ × S {\displaystyle {\text{bind}}\colon (S\rightarrow T\times S)\rightarrow (T\rightarrow S\rightarrow T'\times S)\rightarrow S\rightarrow T'\times S} = m ↦ k ↦ s ↦ ( k t s ′ ) where ( t , s ′ ) = m s {\displaystyle \ =m\mapsto k\mapsto s\mapsto (k\ t\ s')\quad {\text{where}}\;(t,s')=m\,s}
である。
圏論的な見方では、状態モナドはデカルト閉圏の定義に現れる積函手と指数函手の随伴から作られる。