この記事は株式会社LIFULLの数学同好会あなぐま会のための発表資料です。
同僚のアナリストやデータサイエンティストに、最短でオブジェクト指向プログラミングを味わってもらうことを目指しています。『線型代数学周遊 ~応用をめざして~』という本の4.6節「圏論の初歩とプログラミング」を基に、Pythonのコードと併せて説明します。この本は少し変わっていて、「線型代数に関わる応用の分野を俯瞰し、その地図を提供することを」を目指した本(まえがきより)で、行列のテンソル積を説明するために、遠回りして圏論にも触れています。遠回りしていることには次のような意図もあるそうです。
プログラミング言語は言語であります.言語によって表現できる範囲が定まりますし,概念も思想も言語に依存します.つまり,現代的なプログラミング言語によって作成されたソフトウエアにはその思想が受け継がれています.他方,現代の情報機器はそれらによって制御されています.21世紀的な思考パターンの一部を知る意味でもこの話題を取り上げます.
私は数学の素養はない一般のプログラマーであり、底本でも「厳密ではありませんが〜」とある箇所も多いため、正確ではない(もしかしたら間違った)箇所も多いかもしれません。その時はコメントでご指摘ください。
4.6.1 圏論
圏とは,**対象(オブジェクト(object):点)と射(モルフィズム(morphism):矢印)**によって構成されるものです.(中略)差異も大きいので,非常に遠くから眺めてですが,圏論における「対象と射」がオブジェクト指向プログラミングにおける「クラスとメソッド」に対応しています.
圏論の「オブジェクト」が、プログラミングにおける「オブジェクト(サンプルコード1のsample_object
)」ではなく「クラス(サンプルコード1のSampleClass
)」に対応しているのが少しややこしいです。
# これがクラス
class SampleClass:
pass
# これが(プログラミング上の)オブジェクト
sample_object = SampleClass()
続けます。
定義4.4 (圏:ラフ版)$C$が圏とは
- **対象(オブジェクト)**の”集合”$Obj(C)$が定まる.
- 任意の対象$A, B \in Obj(C)$に対して,以下を満たす**射(モルフィズム)**の集合
$$ Hom_c(A, B) := \{ f : A \rightarrow B \}$$
が定まる.
(a) $(A, B) \neq (C, D)$のとき
$$Hom_c(A, B) \cap Hom_c(C, D) = \emptyset$$
(b) $Hom_c(A, A)$は恒等射$1_A$を含み,
(c) 合成した射が存在する:
$$Hom_c(A, B) \times Hom_c(B, C) \rightarrow Hom_c(A, C)$$
ここでいっている”集合”は「厳密には”集合全体”ではなく,ユニバースという集合全体より小さな”もの”を導入」するという注があります。