射の合成は\(\circ\)とし、また単位律、結合律は成り立っているとする。\(T\)は、\(\mathcal{C}\)から\(\mathcal{C}\)への関手としよう。まとめると試案の圏は以下のようになる。図で示すと下図のようになる。T(T(A)),T(T(T(A))),...\)も同じようによって移される。\)は、それぞれを圏と見なすことにしよう。\)と表すことにしよう。試案の圏は次のように書き直される。いうことになるが、\(\mathcal{A}\)は圏である。結合律:省略これで、圏\(\mathcal{C}\)が出来上がった。細部も加えて示したのが下図である。図5:冪集合を利用してモナドの候補を作り出した。\(T\)が圏\(\mathcal{C}\)を結ぶ関手、これがモナドと呼ばれるものになる。\(return,join\)は圏\(\mathcal{C}\)の射であるそして、これをモナド定義の候補としたい。Haskellのモナドで確認するモナドを表すための候補が出てきたので、先に進める前に、本当にそうなのかを、Haskellでのモナドの定義を利用して確認してみよう。Control.Monadのパッケージを見ると次のようになっている。sさらに、これらのメソッドは単位律と結合律を満たすものとする。Haskellでのモナドのクラスで用意しなければならないメソッドは、\(return\)とバインド(bind)と呼ばれる\((>>=)\)だ。\(return\)はモナドの上位クラスであるアプリカティブ(Applicative)で定義されるので、モナドのところで定義する必要があるメソッドは\((>>=)\)だけだ。2番目のメソッド\((>>)\)は、バインドを用いて定義されているので、定義する必要はないし、またそれほど重要なメソッドでもない。(>>=)\)と\(return\)である。return\)と\(join\)が、Haskellでのメソッド\(return\)と\((>>=)\)に対応していることを示さなければならない。b\)上の表で、式1は対応していることが分かる。(>>=)\)は対応しているとは即断しがたい。そこで、Haskellでの定義を変形してみよう。b)\end{eqnarray}の部分は、下図のように表すことができる。図6:モナドの候補を確認する。Haskellの構造に変換し、Haskellで定義されているモナドの構造に対応しているかを観察する。b\)を関手\(m\)によって、右側に移される。a\)が与えられた時、その終点をあたえる。b)\end{eqnarray}となる。b\end{eqnarray}である。a\end{eqnarray}となり、\(join\)同じであることが分かる。これで、冪集合から得られた2関数がモナドを定義するのに必要な関数であるという裏付けを得たので、さらに議論を進めることにしよう。return,join\)を\(η,μ\)で置き換え、汎用化してみよう。T(A)\end{eqnarray}さらに、\(T(A),T(T(A)),...\)は同じ薄茶色で表し、薄緑色の部分をなくすと、前に示した図は次のように表すことができる。return,join\)を\(η,μ\)で置き換える上の式をもう少し変形してみよう。A\)を用いると上記の式は次のようになる。T\end{eqnarray}と記述することができる。そこで、圏\(\mathcal{C}\)を対象とし、関手\(T\)を射とし、モナドを表す圏\(\mathcal{D}\)をつぎのように定義できる。\)合成:\(\circ\)そして、次のように、単位律、結合律を満たすものとする。T\end{eqnarray}を満たすものとする。\)であることから、矛盾なく拡張することが可能である。圏\(\mathcal{D}\)を図で示すと以下のようになる。図8:モナドとしての関手\(T\)を射とした圏を構成するここで得たモナドの圏\(\mathcal{D}\)は、圏論の教科書で定義されているものと同一であることに気がつくことと思う。この圏の射、即ち関手\(T\)は、一般にモナドと言われる。ライプニッツのモナドの概念から始めて、冪集合を用いてモナドの定義に必要とされるだろう関数\(return,join\)を求め、その関数がHaskellでのモナドの定義で用いられているものと同じであるという検証を得て、モナド\(T\)を射とする圏\(\mathcal{D}\)を定義することができた。この圏をしばらく観察してみよう。対象\(\mathcal{C}\)を小さくし、射\(T\)、恒等射\(I_\mathcal{C}\)、そしてこれらから合成される射を描くと下図のようになる。図9:モナドは自己関手\(T\)を射としたモノイド圏であることが分かるこれは、その右側に描いたモノイド圏(単位律とかつ結合律を満たす二項演算子により構成された圏)と構造が同じであることが分かる。従って、モナドは、自己関手\(T\)を射としたモノイド圏であることが分かる。精錬化するこれまでの議論でモナドの定義は出来上がったが、もう少し綺麗に纏めることにしよう。μ\)が関手から関手への射になっているので、自然変換と見なせる。自然変換を復習しておこう。\mathcal{D}\)があり、前者から後者へ関手\(F,G\)が存在したとする。\)が成り立つことである。この関係を下図に示す。図10:自然変換は関手から関手への射である。\)を構成してみよう。図で表すと以下のようになる。\)で、自然変換\(η(return),μ(join)\)を射とし、モナドとしての関手\(T\)を対象とするさらに、\(I_T\)は\(T\)と表すこともできるので、これを用いて、単位律、結合律を可換図式で表すと下図になる。対応するモナドの定義が出来上がったので、圏論での最も重要な概念である随伴との関係について述べておこう。ウィキペディアでは随伴は次のように定義されている。Hom}_{\mathcal{D}}(Y,R(X))\end{eqnarray}が変数\(X,Y\)に対して自然となるものをいう。このとき、関手\(L\)を左随伴関手と呼び、\(R\)を右随伴関手と呼ぶとなっている。Hom}\)集合を用いての随伴の定義しかし、上記の定義からモナドとの関係を説明するのは煩雑になるので、もう一つの定義を使うことにしよう。それは、やはりウィキペディアで次のように定義されている。R\end{eqnarray}がそれぞれ\(L\)と\(R\)上の恒等変換\(I_L,I_R\)となることをいうとなっている。identities)と呼ばれる。これを可換図式で示そう。図14:余単位・単位による随伴の定義の一部である三角恒等式の可換図式それではこの定義からモナドを導くこととしよう。\)での射\(η,μ\)が、随伴を定めている\(η,ε\)から得られることを示せばよい。L\end{eqnarray}としてみよう。モナド側の\(η\)を得ることは次に示すように簡単である。T\end{eqnarray}それでは\(μ\)について考えよう。次のように変換して求めることができる。T\end{eqnarray}図示すると次のようになる。\)の単位律、結合律を随伴から得てみよう。T\end{eqnarray}を得る。それぞれで左辺と右辺は恒等変換になっていることもわかる。可換図式で示すと下図のようになる。図16:随伴の定義からモナドの単位律を得る次は結合律だ。単位律と同様に式を展開することで得ることができる。その過程を可換図式で示しておこう。冪集合をHaskellで実装する無事にモナドを定義することができたので、考える出発点であった冪集合に戻り、これをHaskellで実現することとしよう。ここでは、集合をリストで表すこととしよう。要素\(a,b,c\)からなる集合は\([a,b,c]\)と表すことにする。冪集合は、それぞれの要素に対して、含むか含まないかの組合せを作ることだ。リストは\((x:xs)\)と表すことができるので、\(xs\)で作られる冪集合の部分集合のそれぞれに要素\(x\)をつけたものとつけないものとの和集合となる。