このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

圏、関手、モナドはどうしたら分かるの?

「みずすましさんの「圏論メモ」への注釈集」にて

もうひとつのエントリー「関数型言語Haskellとの関係」についても、できれば間をおかずに(後で)コメントしたいと思いますが……

という予定に従います。が、文言を追って注釈を加えるのではなくて、もっと一般的/雑駁<ざっぱく>なオシャベリをすることにします。うん、実に雑駁。

圏は、集合と写像からなるとは限らない

もう一度強調しますが、「圏の対象=集合、圏の射=写像」という認識はやめたほうがいいですよ。確かに、対象が集合(+構造)であり、射が写像である実例は多いのですが、すべてがそういうわけではありません。僕の「はじめての圏論」シリーズを眺めてもらえれば、「対象が集合、射が写像」である例を避けているのがわかるでしょう。実際:

  1. しりとりの圏: 対象は文字、射は文字列
  2. 行列の圏: 対象は非負整数、射は行列
  3. 圏としてのモノイド: 対象は何でもいい(ひとつの)モノ、射はモノイドの要素
  4. やせた圏=圏としてのプレ順序集合: 対象はプレ順序集合の要素、射はプレ順序関係
  5. 変換キューの圏: 対象はデータ型、射はプログラム
  6. ブレイド図の圏: 対象は有限個の点(釘)、射は曲線(紐)のたば

こういう圏達を、集合と写像表現する(具象圏への忠実関手を構成する)ことはとても大事ですが、最初から集合と写像として与えられているなら、表現もあまり面白い話になりません。

モナド法則を納得するには

みずすましさんは、自己関手、モナドモナド法則に関していろいろ考えておられますが、考え過ぎのような印象を持ちます。これはあくまで印象ですけどね。「分かった気がする」過程は個人差があるので、僕から見て「考え過ぎ」でも、必要な行為なのかも知れません。

というわけで、以下、普遍性のない僕個人の感覚でものを言います; 拡張(extension)スタイルによるモナドの定義をいじり倒す時間と労力は、Kleisli圏へ進むほうに振り向けた方が得だと僕は感じます。実例を調べたり計算をするには、拡張スタイルはけっこう便利なのでいいと思いますが、天下りな感じが払拭できません(僕の感覚では)。

Kleisli圏にいけば、モノド法則は、圏の結合法則/左単位法則/右単位法則に過ぎません。モナドは、Kleisli圏を下支えする計算機構と思うと納得感があるかもしれませんよ。

※それはそうと、Kleisliをカタカナで書きたいのだけど、なんて読めばいいのだ?

モナドは、なぜ役に立つのか

モナドが計算やプログラミングに役立つ内的必然性は、僕にはサッパリわかりません(「不思議だがホントウだ」としか言えない)。が、現象的/表層的には次の事情だと思います。

まず、ベースとなるデータ(値)と計算(関数)の圏Cがあります。圏Cのデータ/計算を拡張する機構がモナドMです。データ型(データ領域)Xの拡張がM(X)です。データだけでなくて、計算f:X→Yも、M(f):M(X)→M(Y)と拡張されます。例えば、Listモナドなら「並びのデータ型と、並びにいっせいに作用する計算」を提供するし、Maybeモナドなら「未定義値を持つデータ型と、未定義を許す計算」を提供します。

M(f):M(X)→M(Y)でも、拡張されたデータ型と拡張された計算として役に立ちますが、自明に過ぎるきらいがあります。任意のデータ型Xから、拡張されたデータ型M(Y)への射(その射自体はCに含まれる)のほうがもっと役に立ち、多くの場合に自然な概念になります。この X→M(Y) の形の射(Kleisli射と呼ぶ)達を合理的に編成したらKleisli圏となります。このとき実は、C上の自己関手(endofunctor)M以外に、モナド乗法μとモナド単位ηが必要になります。

以上の構成(Kleisli構成)が、圏Cに対するとても都合のよい拡張圏Kを与えます。Cが、自然にKに埋め込まれる点も扱いやすい理由でしょう。まー結局、基本的データ/計算から、システマチックに拡張したデータ/計算が作り出せる点がモナドが役に立つ現象的/表層的な理由かと。

モナドとモノイド

モナドmonad)とモノイド(monoid)の発音が似ている(紛らわしい!)のは偶然なのでしょうか? 僕は事情を知りません。が、実際のところ深い関係があるのは確かです。この関係は、モナドの別な側面でもあるので、いちおう参考までに。

※なんか最近、メモ編に書くべきネタを本編に書いているな、まーいいや。

集合Aと、二項演算(積とか乗法とか呼ばれる)m、特定の要素(単位元、中立元などと呼ばれる)uの組(A, m, u)で、適当な法則(後述)を満たすものがモノイドです。mは二項演算なので写像 m:A×A→A です。uを、Aの要素(元)そのものではなく、u:{0}→A と考えましょう、もちろん、u(0)はAの単位元そのものです。{0}をIと書き換えて、結合法則、左単位法則、右単位法則を可換図式風に書き下すと:

 A×A×A → (A×A)×A -(m×A)→ A×A -(m)→ A
 ==============================================
 A×A×A → A×(A×A) -(A×m)→ A×A -(m)→ A

 I×A -(u×A)→ A×A -(m)→ A
 ============================
 I×A → A

 A×I -(A×u)→ A×A -(m)→ A
 ============================
 A×I → A

イコールが並んだ横棒の上下の射(ただし、横向きに全部結合する)は同じ射です。idAの代わりに単にAと書いてあります。無名の矢印は“自然な同一視”です。

さて、上の可換図式は集合圏で解釈しました。これを、ベクトル空間と線形写像の圏、しかも「×」をテンソル積として解釈すると、いったい何を定義したことになるでしょう。結合法則と左右の単位法則を満たす“積”(双線形写像)を持つベクトル空間です。それは、代数(algebras)という、とんでもなくおおざっぱで紛らわしい名前で呼ばれている代数系です(日本語だと「多元環」という用語もあるようです)。

モノイド概念を、いろいろな圏の上で考えると、その環境(ambient)となる圏に応じていろいろな代数系が生まれます。環境となる圏には、なんらかの積「×」と特別な対象「I」が必要ですが、このことは「モノイド概念を定義する環境となる圏はモノイド圏(monoidal category)であるべし」と言えます。モノイド圏が対称(symmetric)であることは要求しません。

実は、モナドも、とある圏のなかのモノイドなのです。これ以上詳しい説明はやめますが、下の表に、いろいろな圏におけるモノイド概念を挙げます。

環境となる圏 その圏の積 その圏の単位 モノイド概念
集合圏 直積 単元集合 普通のモノイド
ベクトル空間の圏 テンソル スカラー 代数(多元環
頂点集合がXである反射的グラフの圏 バンドル積(ファイバー積) 反射的離散グラフ Xを対象集合とする圏
Cの自己関手と自然変換の圏 関手の結合 Cの恒等関手 C上のモナド
(小さい)圏の圏 圏の直積 単一対象とidだけの圏 (小さい)厳密モノイド圏

この表を見て「怖い」と思ったかたは、→ http://d.hatena.ne.jp/m-hiyama-memo/20060414/1145007216

[追記 date="投稿よりほぼ14年8ヶ月後"]上の表の三番目の例に関して詳しいことを書きました。→ グラフ達のモノイド圏内のモノイド対象は圏
[/追記]