読者です 読者をやめる 読者になる 読者になる

モナド、あるいは自己関手の圏におけるモノイド対象について

Haskell

どうもこんばんは、south37です。 今日は久々にHaskellネタをぶっ込んで行きたいと思います。題材は、Haskellを知っていれば嫌でもその名を耳にするであろう「モナド」についてです。

そもそもモナドって何なんですか?

はい、何なんでしょう?ここで、フィリップ・ワドラーの言葉を引用してみます。

モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?

うん、何だかよく分かりませんが超絶カッコいいですね!!こーゆうのサラッと言えたらいいですね!!!

で、結局何なんですか?

ワドラーの言葉は専門用語を使って簡潔にまとめられていた為、ベースとなる知識が無い状態では全く意味が分かりませんでした。まずは、ワドラーの言葉に出てきた単語の意味を一つ一つ見て行く事にしましょう。

自己関手

最初のキーワードは 自己関手 です。そのまま読むと、「自己」の「関手」です。はて?

関手(Functor)というのは以前ブログでも取り上げましたが、圏から圏へと対象と射の「対応付け」をおこなうものでした。では、「自己」という言葉はどういう意味でついているのでしょうか?

実は、ある一つの「圏」から「同じ圏」への対応付けを行う「関手」が、 自己関手 です。自身への対応付けを行うから「自己」と付いている訳です。

ここで一つ、事実を述べさせて頂きます。

モナドは自己関手である

ようは、「モナド」も「関手」の一種に過ぎないという事です。

自己関手の圏

では、ワドラーの言葉に出てきた「自己関手の圏」とは何なのでしょうか?実は、これは「自己関手」を対象とする「圏」の事を指しています。「自己関手」の集合を対象の集合と考え、それぞれの「自己関手」の間に「射」を定義出来れば、「圏」の構造を作る事が出来ます。

では、「関手」の間の「射」とは何なんでしょうか?実はこれは「自然変換」と呼ばれる物です。「自然変換」の定義は

ある函手をその圏に関する内部構造(即ち射の合成)を保ちながら別の函手に変形する方法を与えるもの

です。ざっくり言えば「関手」が行う(対象および射に対する)それぞれの変換について、別の関手の行う変換へと「対応付け」を行う訳です。「関手」と「関手」の「対応付け」であり、「関手」を対象と見れば「自然変換」は射と見なせる訳です。

まとめると、「自己関手の圏」とは「自己関手」を「対象」として持ち、その「自己関手」の間に「射」として「自然変換」が定義されているような「圏」です。

モノイド対象

「自己関手の圏」までは分かりました。では、最後の「モノイド対象」とは何なのでしょうか?

「モノイド対象」は、ものすごくざっくり言うと、 モノイドっぽい構造を持つ「圏」の対象 です。

...何だかあまり情報量が増えていませんね。そもそもモノイドとは何でしょうか?

モノイド

モノイドは、ざっくり言うと「二項演算を定義出来る集合」です。ただし、「単位元の存在」と「結合則が成り立つ事」が必要条件となります。

  1. 単位元の存在 Sの元として単位元eが存在して、Sの任意の元aに対して e ◦ a = a ◦ e = a
  2. 結合則 Sの任意の元a, b, cに対して、(a ◦ b) ◦ c = a ◦ (b ◦ c)

より正確には、「ある集合」とその任意の要素の間の「二項演算」をひとまとめにして「代数的構造」と呼び、その集合内の要素の一つとして「単位元」が存在し、かつ「二項演算」に結合則が成り立つ場合には、その「代数的構造」は「モノイド」であると言えます。

例えば、「任意の整数」と「掛け算」のなす「代数的構造」を考えると、1単位元であり「掛け算」には「結合則」が成り立つ為、「モノイド」である事が分かります。

これで、モノイドが何であるかはこれで分かりました。

モノイド対象 再

では、もう一度「モノイド対象」について考えてみましょう。「モノイド対象」は「モノイド」っぽい構造を持つ「圏」の「対象」であると述べました。実はこのような「圏」は「モノイド圏」と呼ばれ、wikipediaでは

自然同型の違いを除いて結合的な双関手⊗: C × C → Cについて(再び自然同型の違いを除いて)左および右単位元となる対象Iを備えた圏C

であると説明されています。「結合的」とか「単位元」とか、何となくモノイドっぽいワードが定義には含まれていますね。ざっくり言えば、「二項演算」に対応する概念である「双関手」と「単位元」に対応する概念である「単位対象」が定義されているような「圏」が「モノイド圏」です(結合性、右恒等性、左恒等性と呼ばれる自然同型も必要)。

「モノイド圏C」の対象をMとして、乗法と呼ばれる射μ: M ⊗ M → Mと単位射と呼ばれる射η: I → Mが定義されているとします。さらに図式

がそれぞれ可換である時、Mは「モノイド対象」であるといいます。μηの存在の分ちょっと条件が厳しくなっていますが、ほぼ「モノイド圏」における対象が「モノイド対象」です。

もう一度、ワドラーの言葉を考える

さて、それでは「自己関手の圏におけるモノイド対象」という意味をもう一度考えてみましょう。きっと、「自己関手の圏」が「モノイド圏」であり、その「モノイド対象」が「モナド」なのだと思われます。では、「自己関手の圏」におけるモノイドっぽい構造とは何でしょうか?

「自己関手」同士の「合成」を考えてみると、合成されたものも「自己関手」である事が分かります。その為、合成を「二項演算」として考える事が出来、さらに「単位元」となる「恒等関手」の存在や「結合則のようなもの」が成り立てば、モノイドのような構造が出来る事が分かります。

式を用いてもう一度表現してみます。M(M(X))M◦M(X)と見なすと(自己関手MをXへ二回適用させる操作を、Mを二つ合成したM◦MをXへ適用させる操作と見なすと)、というのは「自己関手M」を二つ受け取って一つの「自己関手」を返す「二項演算」と考える事が出来ます。さらに、「恒等関手I」という全ての対象と射を「それ自身」へと移す「自己関手」を考えると、「恒等関手I」はMを適用する前に適用してもMを適用した後に適用しても全体としては変わりありません。すなわち、M◦II◦MMも同じであり、これによって「恒等関手I」が自明な「単位元」となる事が分かります。

また、「結合則のようなもの」は、M◦(M◦M)(M◦M)◦Mが対応づく事だと考える事が出来ます。以上を踏まえれば、「自己関手の圏」において「関手の合成」を「二項演算」と見なせば「モノイドの様な構造」を作り出せる事が分かります。

答えが見えてきたのでは無いでしょうか?

モナドの定義

ここで一度、モナドのきちんとした定義を見ておきたいと思います。wikipediaによれば、

Cが圏のとき、C上のモナドは関手T:C -> Cと2つの自然変換η: I -> T(Iは恒等関手)とμ:T ◦ T -> Tから成り、これらは以下の条件をみたす

  1. μ ◦ Tμ = μ ◦ μT (自然変換 T◦T◦T -> T として)
  2. μ ◦ Tη = μ ◦ ηT = I_T (自然変換T -> Tとして。ここでI_TT上の恒等変換である)

と述べられています。1と2を可換図式で表すと、以下のようになります

1が結合則の類似物、2が単位元の存在の類似物となっています

(と、wikipedia先生は説明してくれていますが、2に関しては正直僕の中ではしっくり来ていません。というのも、恒等関手Iが常に自明な単位元として存在するはずであるからです。ただ、Iの振る舞いを抽象化してMとの関係である自然変換η: I -> M、そしてμ:M ◦ M -> Mを通してのみI ◦ MM ◦ IMを対応づけるならば、2の関係が必要となるのかもしれません。「対象」自身の性質では無く、「他の対象との関係」である「射」を通してのみ構造を作る「圏論」においては、単位元の存在を示すには2のようなまどろっこしい表現になってしまうのかもしれないですね。)

1は、T ◦ (T ◦ T)(T ◦ T) ◦ Tが自然変換で結びついている事を示しています。2は、T(X)T(I(X))I(T(X))と結びつけています。図式は、モノイド対象の説明で出てきたものとそっくりになっています。

よって、確かに「モナド」は「自己関手の圏におけるモノイド対象」であるという事が分かりました。

まとめ

Haskellを議論する際によく話題に上る「モナド」について、理解を深めました。「モナド」が「単なる自己関手の圏におけるモノイド対象に過ぎない」という事も分かりました。

今回は「圏論」における「モナド」についてだけ触れましたが、次回ではいよいよ「Haskellにおけるモナド」についてまとめて行きたいと思います。MonadFunctorと同様に「型クラス」として実装されています。その際に、自然変換ημに対応するような関数returnjoinの存在が保証されます。その辺もうまく説明出来たらいいと思います。