見出し画像

みんなの圏論を読んで


本の目次

第1章:はじめに
第2章:集合の圏
第3章:Setに関する基本的考察
第4章:背後に潜む圏と関手
第5章:圏論の基本
第6章:圏に関する基本的考察
第7章:活躍する圏

圏論を学ぶきっかけ

元々ソフトウェアエンジニアだった私は関数型言語と圏論に深いかかわりがある事は噂に聞いていた。ただ関数型言語自体特に使う事がなく、それで特に不便もしなかったので学ぼうとする意欲は無かった。更に抽象的で無意味な数学があまり好きじゃないので「ケンロン、ケンロン」と言っている界隈にも知りもせずに抵抗感があったのだが、代数解析学を理解したいという謎のモチベーション(※これも役に立たない数学そうなので矛盾した感情だが・・・)があり、そこから遡り「ホモロジー代数」←「代数トポロジー」←「圏論」という順序で学ぼうと、数学系とは限らない応用家向けの本として本書を手にした。本書は私にとって非常に満足する内容であり、特にデータベーススキーマ、モナド等の実学に近い範囲のモチベーションを満足してくれるものになっていた。特に最近は無機質に数学の骨組みを知ろうというモチベーションは無いのでこのように生き生きと数学の応用面を紹介してくれる本が好きである。
※いつもの断りですが素人状態から一か月程度で読んでいます。これから書く記事の内容が本質を外していたらすみません。

圏論とは何か?

圏自体は数学の原始的な所であり集合に似ている。圏論はRelationのある集合論みたいなものである。集合とは単なるものの集まりであり基本的にはRelationは無い。即ち圏の方が(本質的かは兎も角)汎用的であるのはすぐ分かる。しかし集合にRelationらしきものを入れれば圏であるならば、圏論と集合論には本質的差異が無くわざわざ学ぶ意味がないとも思える。クリティカルな違いはRelationが射として捉えた時、射の整合性もないと駄目という所に生まれ、簡単に言うとそれは射の合成則である。このことから集合論プラスアルファで各論的に洞察を行うのではなく射の構造を含めたフレームワークとして圏論を論じた方が理解に煩雑性が生まれず統一的観点からRelationのある系を眺めることが出来る。またこの事は各論の具体的非本質部分に振り回されないという意味でも重要である。

圏と関手

圏$${\mathcal{C}}$$とは対象(Object)$${Ob(\mathcal{C})}$$と対象$${x, y \in Ob(\mathcal{C})}$$間の射集合$${Hom_\mathcal{C}(x, y)}$$がある系のことである。ここで例えば集合の圏$${\mathcal{Set}}$$とは対象$${x, y}$$がそれぞれ集合であり、集合間の合成則(と恒等射)を仮定した系である。(※集合論の場合対象が単なる記号だが集合の圏は対象が集合なので記号までワンステップ挟む事に注意せよ)。更に圏は対象が集合以外にも色々考えられる。例えば対象を位相空間とした時には位相空間の圏と見做すことが出来るが射は位相空間の準同型即ち連続写像である。圏論における重要な概念は圏間の関手と呼ばれるある特性を持った写像を論じる事でRelationを持った系を様々な世界から眺められることにある。ある特性とは世界毎に対象とRelationがあるので任意の世界でその関係を追い、かつ任意のタイミングで目線を移しても同じ結果を導かなければならないという要請である。これは図式の可換性の事である。例えば位相空間の圏から集合の圏へと移すことが出来るがこの時の関手を忘却関手と呼ぶ(※位相特性を忘却している)。本書の例ではないがプログラミングを知っている人は(自動的にでも)アップキャストが走る事が忘却であり、クラスというものはメソッドがある為本質的に集合では無く圏に近く、忘却によるメリットが大きい事はすぐに分かるだろう。

データベーススキーマと圏

本書では圏のこの観点がデータベースを知っている人からすると非常に分かりやすいものであると思う。(リレーショナルデータベースにおけるデータベース)スキーマは圏(の表示)である。主キーと外部キーのみからなるひとつのテーブルが対象である。一般にスキーマは複数の表からなる為、表間の射が考えられるがそれは外部キーから主キーへの対応である。因みにRelationの終わりの表(※終対象)は主キーしかない。このようなモデリングをするとデータベーススキーマが圏論と密接に結びついている事が分かるだろう。インスタンスとは関手$${\mathcal{C} \rightarrow \mathcal{Set}}$$の事であり、即ちスキーマの集合による表現の事である。これはスキーマで規定された設計に従ったデータを持つ表の集まりを意味している。即ち関手の規則は設計とインスタンスの規則が整合的であることを意味する。米田の補題$${Hom_{\mathcal{C-Set}}(Y_c, I) \simeq I(c)}$$はスキーマとインスタンスの関係から直感的に把握することが出来る。表現可能関手$${Y_c}$$は表$${c}$$から始めてスキーマの制約を満たすような可能な限り自由なインスタンスを意味している(※即ちそれは表$${c}$$からプレースホルダーを使い参照展開したものと同じ)が、そこから具体的なインスタンスを規定するという事はプレースホルダーを具体的な表$${c}$$のインスタンスの行と対応させ埋めることと同じである。

モナド

モナドは関数的でない演算を関数型プログラミング言語へ埋め込んだり出来る考えであり実学的に役に立つ。モナドの構成要素は次の3つである。

  1. 関手$${T: \mathcal{Set} \rightarrow \mathcal{Set}}$$

  2. 自然変換$${\eta: id_{Set} \rightarrow T}$$

  3. 自然変換$${\mu: T \circ T \rightarrow T}$$

ただし自然変換とはある規則(※自然性の規則)を満たすような関手間の射のことである。直感的に説明すると関手$${T}$$はクラスの変換(※本書の例ではないが例えばJava8のOptional)である。モナドにより集合$${X}$$は集合$${T(X)}$$に移る。ここでモナドによるクライスリ圏$${\mathcal{Kls}}$$を対象が集合であり、射が$${Hom_{\mathcal{Kls}}(X, Y) = Hom_{\mathcal{Set}}(X, T(Y))}$$なるものとして定義する。こうすると自然変換$${\eta, \mu}$$はそれぞれ、単位写像(※従来のメソッド)がコンテナ内でも表現される事とコンテナ内のメソッドチェーンが可能な事に対応している。今$${T}$$を暗黙的なコンテキストと見做すとクライスリ圏ではあたかもNullPointerExceptionが生じそうであるものの、実際にはOptionalに変換しているので生じないというマジックがあることが分かるだろう。これは計算機科学においてmaybeモナドと呼ばれnull安全性の担保もこの一部である。即ちモナドに対する洞察は関数になっていない雑な設計(※事前にnullチェックが必要な設計)があったとして、後からnull安全性を付与できるという重要な視座を与えているのである。本質的な骨組がある雑は数学サイドから棄却されない、つまり本質こそ数学である!

その他の事項

自然変換周り、普遍性は今回の記事では述べないが圏論においては非常に重要な内容である。機会があればまた述べる。

まとめ

圏論を少し分かった程度ですが代数や幾何をやる上で非常に見通しが良くなりました。本書は応用的観点が豊富で面白いのでぜひ読んでみてください。お勧めです。

フォロー、スキ、シェア待ってます!

この記事が気に入ったらサポートをしてみませんか?