圏論
数学の一分野。対象(object)と射(morphism)、その合成と恒等射からなる「圏」を基本に、構造を中身でなく射の振る舞いで捉える。関数型プログラミングでは「型=対象・関数=射」とする圏が、Monad 等の抽象の共通言語になる。
圏の定義
- 対象 の集まりと、対象間の 射
f : A → B - 合成
g ∘ f(結合律(h∘g)∘f = h∘(g∘f)) - 各対象に 恒等射
id(単位律)
例: Set(集合と関数)、Hask(型と関数)、半順序(対象=要素・射=≤)、モノイド(対象1つ・射=要素)。
プログラミングとの対応
| 圏論 | プログラミング |
|---|---|
| 対象 | 型 |
| 射 | 関数 |
関手(Functor F: C→C) | map を持つ型構築子(高階多相) |
| 自然変換 | 関手間の多相関数([a] -> Maybe a 等) |
| 積 / 余積 | 直積・タプル / 直和・ADT |
| 始対象 / 終対象 | Void / Unit |
指数対象 B^A | 関数型 A -> B |
中心的な概念
- Monad =「自己関手の圏におけるモノイド対象」 — 自己関手
Tとη: Id→T(return)・μ: T²→T(join)。Monad の正体 - 双対(opposite category
C^op) — 射を全部逆向きに。Comonad は Monad の、余積は積の双対 → 双対 - 普遍性(universal property) — 「ある性質を満たす唯一の射」で対象を特徴づける。始代数からの一意射 = catamorphism(再帰スキーム)
- 随伴(adjunction)
F ⊣ G— カリー化(積と指数の随伴)、自由↔忘却。圏論の最重要概念のひとつ - カリー=ハワード=ランベック対応 — 論理=型=圏(デカルト閉圏)。カリー=ハワード対応の圏側の足
なぜ FP に効くか
多くの抽象が「同じ圏論的構造の別インスタンス」と分かり、法則(functor 則・monad 則)が設計の指針になる。一方、実用に圏論は必須ではない(過度な抽象化は偶有的複雑性を増やしうる)。共通パターンの整理と法則の根拠として使うのが勘所。
関連
- Monad / Comonad — 自己関手のモノイド対象とその双対
- 双対 — opposite category が双対の源
- 再帰スキーム — 代数/余代数と始代数/終余代数の普遍性
- カリー=ハワード同型対応 — 論理=型=圏の三項対応
- ADT / GADT — 積/余積という圏論的構成