范畴论(Category Theory)是数学中一门高度抽象的学科,被誉为"数学的数学"。它研究数学结构之间的共同模式和关系,提供了一种统一的语言来思考和描述不同数学领域中的概念。本文从基础概念出发,逐步深入到函子、自然变换、极限、伴随函子、Yoneda引理等重要主题,并探讨范畴论在编程和逻辑中的应用。
范畴论由 Saunders Mac Lane 和 Samuel Eilenberg 于 1945 年在其开创性论文《Natural Equivalences in General Mathematics》中正式引入。最初作为代数拓扑中处理自然变换的一种形式化工具,后来逐渐发展成为贯穿现代数学的基础语言。
范畴论的核心思想是:与其研究一个对象内部的结构,不如研究它与其他对象之间的关系 。这种"关系优先"的视角被称为"关系相对论"——它聚焦于对象之间的映射(称为态射),而非对象本身的内部构造。
在集合论中,我们关心集合的元素;
在范畴论中,我们关心集合之间的函数,而非元素本身。
这一视角的转变使得范畴论能够跨越不同数学分支,发现它们之间的深层联系。例如,群论中的群同态、拓扑学中的连续映射、序理论中的单调函数——在范畴论的框架下,它们都是不同范畴中的态射,遵循相同的结构规律。
一个 范畴 C \mathcal{C}C 由以下数据组成:
对象(Objects) :一类对象,记作 Ob ( C ) \text{Ob}(\mathcal{C})Ob ( C ) 。对象可以是集合、群、拓扑空间等数学实体。
态射(Morphisms/Arrows) :对于任意两个对象 A , B ∈ Ob ( C ) A, B \in \text{Ob}(\mathcal{C})A , B ∈ Ob ( C ) ,存在一个态射集合 Hom C ( A , B ) \text{Hom}_{\mathcal{C}}(A, B)Hom C ( A , B ) (也称为 hom-set)。每个态射 f : A → B f: A \to Bf : A → B 连接源对象 A AA 和目标对象 B BB 。
复合(Composition) :对于任意态射 f : A → B f: A \to Bf : A → B 和 g : B → C g: B \to Cg : B → C ,存在复合态射 g ∘ f : A → C g \circ f: A \to Cg ∘ f : A → C 。
单位态射(Identity Morphism) :对于每个对象 A AA ,存在单位态射 id A : A → A \text{id}_A: A \to Aid A : A → A 。
以上数据必须满足以下公理:
结合律 :对于 f : A → B f: A \to Bf : A → B 、g : B → C g: B \to Cg : B → C 、h : C → D h: C \to Dh : C → D ,有 ( h ∘ g ) ∘ f = h ∘ ( g ∘ f ) (h \circ g) \circ f = h \circ (g \circ f)( h ∘ g ) ∘ f = h ∘ ( g ∘ f ) 。
单位律 :对于 f : A → B f: A \to Bf : A → B ,有 f ∘ id A = f f \circ \text{id}_A = ff ∘ id A = f 和 id B ∘ f = f \text{id}_B \circ f = fid B ∘ f = f 。
可以将范畴想象为一个有向图:
节点 = 对象
有向边 = 态射
边的复合 = 沿着路径走
自环 = 单位态射(每个节点一个)
结合律 = 路径顺序不影响最终结果
范畴
对象
态射
Set
集合
函数
Grp
群
群同态
Top
拓扑空间
连续映射
Vectₖ
向量空间
线性映射
Ring
环
环同态
Poset
偏序集
单调函数
Hask
Haskell类型
Haskell函数
态射 f : A → B f: A \to Bf : A → B 称为同构 ,如果存在 g : B → A g: B \to Ag : B → A 使得 g ∘ f = id A g \circ f = \text{id}_Ag ∘ f = id A 且 f ∘ g = id B f \circ g = \text{id}_Bf ∘ g = id B 。此时称 A AA 和 B BB 同构(记作 A ≅ B A \cong BA ≅ B ),g gg 是 f ff 的逆态射。
核心洞见 :在同构的意义下,范畴论不区分结构相同的对象——"同构的对象在范畴论眼中是相同的"。这一原则被称为"范畴论公理"(The Principle of Equivalence)。
态射 f : A → B f: A \to Bf : A → B 称为单态射 (或单射性的范畴推广),如果对任意平行态射 g 1 , g 2 : X → A g_1, g_2: X \to Ag 1 , g 2 : X → A ,f ∘ g 1 = f ∘ g 2 f \circ g_1 = f \circ g_2f ∘ g 1 = f ∘ g 2 蕴含 g 1 = g 2 g_1 = g_2g 1 = g 2 。在 Set 中,单态射恰好是单射函数。
态射 f : A → B f: A \to Bf : A → B 称为满态射 (或满射性的范畴推广),如果对任意平行态射 h 1 , h 2 : B → Y h_1, h_2: B \to Yh 1 , h 2 : B → Y ,h 1 ∘ f = h 2 ∘ f h_1 \circ f = h_2 \circ fh 1 ∘ f = h 2 ∘ f 蕴含 h 1 = h 2 h_1 = h_2h 1 = h 2 。在 Set 中,满态射恰好是满射函数。
自同态(Endomorphism) :f : A → A f: A \to Af : A → A ,即源和目标相同的态射。
自同构(Automorphism) :既是自同态又是同构的态射。
如果范畴有零对象(既是始对象又是终对象),则任意两个对象之间可以定义零态射。在 Grp 中,零态射是映射所有元素到单位元的群同态。
对象集任意,态射只有单位态射的范畴。称为"离散"是因为它没有任何非平凡的结构性联系。可以理解为没有边(只有自环)的有向图。
如果对任意 A , B A, BA , B ,Hom ( A , B ) \text{Hom}(A, B)Hom ( A , B ) 至多包含一个元素,则范畴称为预序范畴。此时 A ≤ B A \leq BA ≤ B 等价于存在态射 A → B A \to BA → B 。预序范畴本质上是偏序集(Poset)的范畴化形式。
小范畴(Small Category) :对象集和态射集都是集合(而非真类)。
大范畴(Large Category) :对象集是真类(proper class),例如 Set 、Grp 、Top 等都是大范畴。
如果对任意 A , B A, BA , B ,Hom C ( A , B ) \text{Hom}_{\mathcal{C}}(A, B)Hom C ( A , B ) 是集合(而非真类),则称 C \mathcal{C}C 是局部小范畴。大多数常见的范畴(如 Set 、Grp )都是局部小范畴。
对范畴 C \mathcal{C}C 和 D \mathcal{D}D ,积范畴 C × D \mathcal{C} \times \mathcal{D}C × D 定义为:
对象:( C , D ) (C, D)( C , D ) ,其中 C ∈ Ob ( C ) C \in \text{Ob}(\mathcal{C})C ∈ Ob ( C ) ,D ∈ Ob ( D ) D \in \text{Ob}(\mathcal{D})D ∈ Ob ( D )
态射:( f , g ) : ( C 1 , D 1 ) → ( C 2 , D 2 ) (f, g): (C_1, D_1) \to (C_2, D_2)( f , g ) : ( C 1 , D 1 ) → ( C 2 , D 2 ) ,其中 f : C 1 → C 2 f: C_1 \to C_2f : C 1 → C 2 ,g : D 1 → D 2 g: D_1 \to D_2g : D 1 → D 2
复合和单位态射分量定义
范畴 C \mathcal{C}C 的箭头范畴 C → \mathcal{C}^{\to}C → 以 C \mathcal{C}C 中的态射为对象。态射 ( f : A → B ) → ( g : C → D ) (f: A \to B) \to (g: C \to D)( f : A → B ) → ( g : C → D ) 由一对态射 ( h : A → C , k : B → D ) (h: A \to C, k: B \to D)( h : A → C , k : B → D ) 构成,使得下图交换:
A --f--> B
| |
h k
v v
C --g--> D
即 k ∘ f = g ∘ h k \circ f = g \circ hk ∘ f = g ∘ h 。
逗号范畴是箭头范畴的推广。给定函子 F : A → C F: \mathcal{A} \to \mathcal{C}F : A → C 和 G : B → C G: \mathcal{B} \to \mathcal{C}G : B → C ,逗号范畴 ( F ↓ G ) (F \downarrow G)( F ↓ G ) 的对象是三元组 ( A ∈ A , B ∈ B , f : F ( A ) → G ( B ) ) (A \in \mathcal{A}, B \in \mathcal{B}, f: F(A) \to G(B))( A ∈ A , B ∈ B , f : F ( A ) → G ( B ) ) 。一个经典特例是切片范畴 C / C \mathcal{C}/CC / C ,其中 A = C \mathcal{A}=\mathcal{C}A = C 、B = 1 \mathcal{B}=\mathbf{1}B = 1 (单对象范畴)、F = id C F=\text{id}_{\mathcal{C}}F = id C 、G GG 是常值函子 C CC 。
泛性质(Universal Property)是范畴论最强大的概念之一。它通过对象和态射之间的关系来刻画一个对象,而不依赖该对象的内部构造。
始对象(Initial Object) 0 00 :对任意对象 X XX ,存在唯一的态射 0 → X 0 \to X0 → X 。
终对象(Terminal Object) 1 11 :对任意对象 X XX ,存在唯一的态射 X → 1 X \to 1X → 1 。
零对象(Zero Object) :既是始对象又是终对象的对象。
示例 :在 Set 中,空集 ∅ \varnothing∅ 是始对象,单点集 { ∗ } \{*\}{ ∗ } 是终对象。在 Grp 中,平凡群 { e } \{e\}{ e } 是零对象。
始对象和终对象在同构意义下是唯一的——这是泛性质最典型的结论之一。
积(Product) :对象 A AA 和 B BB 的积是三元组 ( P , p A : P → A , p B : P → B ) (P, p_A: P \to A, p_B: P \to B)( P , p A : P → A , p B : P → B ) ,满足:对任意三元组 ( X , f : X → A , g : X → B ) (X, f: X \to A, g: X \to B)( X , f : X → A , g : X → B ) ,存在唯一态射 ⟨ f , g ⟩ : X → P \langle f, g \rangle: X \to P⟨ f , g ⟩ : X → P 使得下图交换:
X
/|\
/ | \
f / | \ g
/ | \
v v v
A <-- P --> B
p_A p_B
记 P PP 为 A × B A \times BA × B 。在 Set 中它就是笛卡尔积。
余积(Coproduct) :对偶于积的概念,即反转所有态射方向。记 A ⊔ B A \sqcup BA ⊔ B 。在 Set 中它是无交并(disjoint union)。
范畴
积
余积
Set
笛卡尔积 A × B A \times BA × B
无交并 A ⊔ B A \sqcup BA ⊔ B
Grp
直积 G × H G \times HG × H
自由积 G ∗ H G * HG ∗ H
Vectₖ
直和 V ⊕ W V \oplus WV ⊕ W
直和 V ⊕ W V \oplus WV ⊕ W (自对偶)
Top
乘积拓扑
不交并拓扑
关键性质 :在 Vectₖ 中,积和余积是同构的(有限维情况),这反映了向量空间范畴的自对偶性。
等化子(Equalizer) :对平行态射 f , g : A → B f, g: A \to Bf , g : A → B ,等化子是态射 e : E → A e: E \to Ae : E → A ,使得 f ∘ e = g ∘ e f \circ e = g \circ ef ∘ e = g ∘ e ,且对任意满足 f ∘ h = g ∘ h f \circ h = g \circ hf ∘ h = g ∘ h 的 h : X → A h: X \to Ah : X → A ,存在唯一 u : X → E u: X \to Eu : X → E 使得 e ∘ u = h e \circ u = he ∘ u = h 。
在 Set 中,E = { a ∈ A ∣ f ( a ) = g ( a ) } E = \{a \in A \mid f(a) = g(a)\}E = { a ∈ A ∣ f ( a ) = g ( a ) } ,e ee 是包含映射。
余等化子(Coequalizer) :对偶概念。在 Set 中,它是对 A AA 进行等价关系 f ( a ) ∼ g ( a ) f(a) \sim g(a)f ( a ) ∼ g ( a ) 的商集。
函子(Functor)是范畴之间的"映射",它保持范畴结构。
给定范畴 C \mathcal{C}C 和 D \mathcal{D}D ,共变函子 F : C → D F: \mathcal{C} \to \mathcal{D}F : C → D 由以下数据构成:
对每个 C \mathcal{C}C 中的对象 X XX ,指定 D \mathcal{D}D 中的对象 F ( X ) F(X)F ( X )
对每个态射 f : X → Y f: X \to Yf : X → Y ,指定态射 F ( f ) : F ( X ) → F ( Y ) F(f): F(X) \to F(Y)F ( f ) : F ( X ) → F ( Y )
满足:
F ( id X ) = id F ( X ) F(\text{id}_X) = \text{id}_{F(X)}F ( id X ) = id F ( X )
F ( g ∘ f ) = F ( g ) ∘ F ( f ) F(g \circ f) = F(g) \circ F(f)F ( g ∘ f ) = F ( g ) ∘ F ( f )
反变(逆变)函子 F : C op → D F: \mathcal{C}^{\text{op}} \to \mathcal{D}F : C op → D 反转态射方向:对 f : X → Y f: X \to Yf : X → Y ,F ( f ) : F ( Y ) → F ( X ) F(f): F(Y) \to F(X)F ( f ) : F ( Y ) → F ( X ) 。
有时也表示为 F : C → D F: \mathcal{C} \to \mathcal{D}F : C → D 是反变的,意味着它从 C op \mathcal{C}^{\text{op}}C op 到 D \mathcal{D}D 是共变的。
遗忘函子(Forgetful Functor)"忘记"结构信息。例如:
U : Grp → Set U: \text{Grp} \to \text{Set}U : Grp → Set ,忘记群结构,仅保留底层集合
U : Top → Set U: \text{Top} \to \text{Set}U : Top → Set ,忘记拓扑结构
遗忘函子看似平凡,但在伴随函子理论中扮演重要角色。
自由函子(Free Functor)是遗忘函子的左伴随。它构建"最自由"的代数结构。例如从集合到自由群的函子:给定集合 S SS ,自由群 F ( S ) F(S)F ( S ) 由 S SS 中元素及它们的逆元生成的单词(考虑等价关系 a a − 1 = e aa^{-1}=ea a − 1 = e )构成。
核心的构造性函子。对于局部小范畴 C \mathcal{C}C :
共变 Hom 函子 Hom ( A , − ) : C → Set \text{Hom}(A, -): \mathcal{C} \to \text{Set}Hom ( A , − ) : C → Set :将 X XX 映射到 Hom ( A , X ) \text{Hom}(A, X)Hom ( A , X ) ,将态射 f : X → Y f: X \to Yf : X → Y 映射到 f ∗ : Hom ( A , X ) → Hom ( A , Y ) f_*: \text{Hom}(A, X) \to \text{Hom}(A, Y)f ∗ : Hom ( A , X ) → Hom ( A , Y ) (后复合)。
反变 Hom 函子 Hom ( − , B ) : C op → Set \text{Hom}(-, B): \mathcal{C}^{\text{op}} \to \text{Set}Hom ( − , B ) : C op → Set :将 X XX 映射到 Hom ( X , B ) \text{Hom}(X, B)Hom ( X , B ) ,将态射 f : X → Y f: X \to Yf : X → Y 映射到 f ∗ : Hom ( Y , B ) → Hom ( X , B ) f^*: \text{Hom}(Y, B) \to \text{Hom}(X, B)f ∗ : Hom ( Y , B ) → Hom ( X , B ) (前复合)。
Set \text{Set}Set 中的幂集函子 P : Set op → Set \mathcal{P}: \text{Set}^{\text{op}} \to \text{Set}P : Set op → Set :对集合 S SS ,P ( S ) \mathcal{P}(S)P ( S ) 是 S SS 的所有子集。对 f : S → T f: S \to Tf : S → T ,P ( f ) : P ( T ) → P ( S ) \mathcal{P}(f): \mathcal{P}(T) \to \mathcal{P}(S)P ( f ) : P ( T ) → P ( S ) 是原像映射。
一个范畴 C \mathcal{C}C 称为具体范畴 (Concrete Category),如果存在忠实(faithful)的遗忘函子 U : C → Set U: \mathcal{C} \to \text{Set}U : C → Set 。此时可以将 C \mathcal{C}C 的对象视为带有额外结构的集合。大多数常见的范畴(如 Grp 、Top 、Ring )都是具体范畴。
自然变换(Natural Transformation)是函子之间的态射,是范畴论中最核心的概念之一——Mac Lane 曾言"范畴论最初就是为了定义自然变换而发明的"。
给定两个共变函子 F , G : C → D F, G: \mathcal{C} \to \mathcal{D}F , G : C → D ,从 F FF 到 G GG 的自然变换 η : F → G \eta: F \to Gη : F → G 是一族态射:
η X : F ( X ) → G ( X ) ( 对每个 X ∈ Ob ( C ) ) \eta_X: F(X) \to G(X) \quad (\text{对每个 } X \in \text{Ob}(\mathcal{C)})
η X : F ( X ) → G ( X ) ( 对每个 X ∈ Ob ( C ) )
使得对 C \mathcal{C}C 中的任意态射 f : X → Y f: X \to Yf : X → Y ,以下图表交换(自然性条件):
F(X) --F(f)--> F(Y)
| |
η_X η_Y
v v
G(X) --G(f)--> G(Y)
即 η Y ∘ F ( f ) = G ( f ) ∘ η X \eta_Y \circ F(f) = G(f) \circ \eta_Xη Y ∘ F ( f ) = G ( f ) ∘ η X 。
如果自然变换 η \etaη 的每个分量 η X \eta_Xη X 都是同构,则称 η \etaη 是自然同构 (Natural Isomorphism),记为 F ≅ G F \cong GF ≅ G 。两个函子自然同构意味着它们在范畴论意义上是"相同的"。
双重对偶 :有限维向量空间到其双重对偶空间的映射 V → V ∗ ∗ V \to V^{**}V → V ∗ ∗ 是自然同构。而 V → V ∗ V \to V^*V → V ∗ 的映射不是 自然的——它依赖于基的选择。
行列式 :一般线性群到非零乘法的行列式映射 det : GL n → R × \det: \text{GL}_n \to \mathbb{R}^{\times}det : GL n → R × 是自然变换。
列表反转 :在函数式编程中,reverse :: [a] -> [a] 是恒等函子到自身的自然变换。
给定范畴 C \mathcal{C}C 和 D \mathcal{D}D ,所有从 C \mathcal{C}C 到 D \mathcal{D}D 的函子构成一个范畴 [ C , D ] [\mathcal{C}, \mathcal{D}][ C , D ] (或 D C \mathcal{D}^{\mathcal{C}}D C ),称为函子范畴 :
对象:函子 F : C → D F: \mathcal{C} \to \mathcal{D}F : C → D
态射:自然变换 η : F → G \eta: F \to Gη : F → G
函子范畴是范畴论中的高级结构,它把"函子之间的关系"也纳入范畴化框架。
Yoneda 引理是范畴论中最深刻的结果之一,被誉为"范畴论的基石"。
对于局部小范畴 C \mathcal{C}C ,任意对象 A ∈ C A \in \mathcal{C}A ∈ C 和任意函子 F : C → Set F: \mathcal{C} \to \text{Set}F : C → Set :
Nat ( Hom ( A , − ) , F ) ≅ F ( A ) \text{Nat}(\text{Hom}(A, -), F) \cong F(A)
Nat ( Hom ( A , − ) , F ) ≅ F ( A )
即从 Hom 函子 Hom ( A , − ) \text{Hom}(A, -)Hom ( A , − ) 到 F FF 的自然变换与 F ( A ) F(A)F ( A ) 中的元素之间存在一一对应。这个双射是自然的(在 A AA 和 F FF 中都是自然的)。
Yoneda 引理最重要的推论是Yoneda 嵌入 :
C ↪ [ C op , Set ] \mathcal{C} \hookrightarrow [\mathcal{C}^{\text{op}}, \text{Set}]
C ↪ [ C op , Set ]
它将每个对象 A AA 嵌入到 Hom ( − , A ) \text{Hom}(-, A)Hom ( − , A ) (称为可表函子),将每个态射 f : A → B f: A \to Bf : A → B 嵌入到自然变换 Hom ( − , f ) : Hom ( − , A ) → Hom ( − , B ) \text{Hom}(-, f): \text{Hom}(-, A) \to \text{Hom}(-, B)Hom ( − , f ) : Hom ( − , A ) → Hom ( − , B ) 。
Yoneda 嵌入是全忠实 的(fully faithful),即:
Hom C ( A , B ) ≅ Nat ( Hom ( − , A ) , Hom ( − , B ) ) \text{Hom}_{\mathcal{C}}(A, B) \cong \text{Nat}(\text{Hom}(-, A), \text{Hom}(-, B))
Hom C ( A , B ) ≅ Nat ( Hom ( − , A ) , Hom ( − , B ) )
这意味着:范畴中的对象完全由其与其他对象的关系决定 。这与范畴论的"关系优先"视角完全一致。
Yoneda 引理告诉我们:
知之全在于其关联 :一个对象完全由它到其他对象的所有态射决定。
交换图即证明 :如果某性质对 A AA 和 B BB 的结构性关系成立,那么它就完全刻画了两者的关系。
替换原理 :在范畴论中,可以用自然变换 η \etaη 的第 A AA 分量 η A \eta_Aη A 来换取它在 F ( A ) F(A)F ( A ) 中的像元 x ∈ F ( A ) x \in F(A)x ∈ F ( A ) 。
在 Haskell 中,Yoneda 引理体现为 Yoneda 数据类型:
data Yoneda f a = Yoneda (forall b. (a -> b) -> f b)
Yoneda f a 与 f a 同构,但 Yoneda 上的 fmap 是 O ( 1 ) O(1)O ( 1 ) 的(延迟计算)。这在流处理库(如 pipes 和 conduit)中有实际应用。
极限(Limit)和余极限(Colimit)是范畴中统一处理数学构造的通用框架。
图表(Diagram) 是类型范畴 J \mathcal{J}J 到 C \mathcal{C}C 的函子 D : J → C D: \mathcal{J} \to \mathcal{C}D : J → C 。J \mathcal{J}J 称为索引范畴 ,通常是小范畴。
锥(Cone) 到图表 D DD 是一个对象 C ∈ C C \in \mathcal{C}C ∈ C 加上一族态射 α j : C → D ( j ) \alpha_j: C \to D(j)α j : C → D ( j ) (对每个 j ∈ J j \in \mathcal{J}j ∈ J ),使得对 J \mathcal{J}J 中的每个态射 u : j → k u: j \to ku : j → k ,有 D ( u ) ∘ α j = α k D(u) \circ \alpha_j = \alpha_kD ( u ) ∘ α j = α k 。这保证 α \alphaα 族与图表中的结构兼容。
余锥(Cocone) 是方向反转的锥。
图表 D : J → C D: \mathcal{J} \to \mathcal{C}D : J → C 的极限 (Limit)是一个锥 ( L , π j : L → D ( j ) ) (L, \pi_j: L \to D(j))( L , π j : L → D ( j ) ) ,满足泛性质 :对任意其他锥 ( C , α j ) (C, \alpha_j)( C , α j ) ,存在唯一态射 u : C → L u: C \to Lu : C → L 使得对每个 j jj 有 π j ∘ u = α j \pi_j \circ u = \alpha_jπ j ∘ u = α j 。记 L = ← D L = \lim_{\leftarrow} DL = lim ← D 或 lim D \lim Dlim D 。
索引范畴
极限
具体构造(在 Set 中)
空范畴
终对象
单点集 { ∗ } \{*\}{ ∗ }
两个离散对象
积
A × B A \times BA × B
平行态射 A ⇉ B A \rightrightarrows BA ⇉ B
等化子
{ a ∈ A ∣ f ( a ) = g ( a ) } \{a \in A \mid f(a)=g(a)\}{ a ∈ A ∣ f ( a ) = g ( a ) }
拉回图 A → C ← B A \to C \leftarrow BA → C ← B
拉回(Fiber product)
{ ( a , b ) ∣ f ( a ) = g ( b ) } \{(a,b) \mid f(a)=g(b)\}{ ( a , b ) ∣ f ( a ) = g ( b ) }
索引范畴
余极限
具体构造(在 Set 中)
空范畴
始对象
∅ \varnothing∅
两个离散对象
余积
A ⊔ B A \sqcup BA ⊔ B
平行态射
余等化子
B / ∼ B / \simB / ∼ 其中 f ( a ) ∼ g ( a ) f(a) \sim g(a)f ( a ) ∼ g ( a )
推出图 A ← C → B A \leftarrow C \to BA ← C → B
推出(Pushout)
( A ⊔ B ) / ∼ (A \sqcup B) / \sim( A ⊔ B ) / ∼
如果范畴中所有小极限都存在,称该范畴是完备的 (Complete)。
如果所有小余极限都存在,称该范畴是余完备的 (Cocomplete)。
Set 、Grp 、Top 、Vectₖ 等常见范畴都是完备且余完备的。
拉回(Pullback) :给定 f : A → C f: A \to Cf : A → C 和 g : B → C g: B \to Cg : B → C ,拉回由对象 A × C B A \times_C BA × C B 和态射 p A , p B p_A, p_Bp A , p B 构成,通用地填充交换方块:
A ×_C B --p_B--> B
| |
p_A g
v v
A ---- f ----> C
在 Set 中,A × C B = { ( a , b ) ∣ f ( a ) = g ( b ) } A \times_C B = \{(a,b) \mid f(a) = g(b)\}A × C B = { ( a , b ) ∣ f ( a ) = g ( b ) } 。
推出(Pushout) :拉回的对偶。在 Set 中,它是无交并的商。
伴随函子(Adjoint Functor)是范畴论中最优雅的构造之一,它在不同范畴之间建立了双向的、自然的关系。
给定函子 F : C → D F: \mathcal{C} \to \mathcal{D}F : C → D 和 G : D → C G: \mathcal{D} \to \mathcal{C}G : D → C ,称 F FF 是 G GG 的左伴随 (F ⊣ G F \dashv GF ⊣ G ),如果存在自然同构:
Hom D ( F ( A ) , B ) ≅ Hom C ( A , G ( B ) ) ( 对 A ∈ C , B ∈ D ) \text{Hom}_{\mathcal{D}}(F(A), B) \cong \text{Hom}_{\mathcal{C}}(A, G(B)) \quad (\text{对 } A \in \mathcal{C}, B \in \mathcal{D})
Hom D ( F ( A ) , B ) ≅ Hom C ( A , G ( B ) ) ( 对 A ∈ C , B ∈ D )
伴随对 ( F , G ) (F, G)( F , G ) 的单位 η : id C → G ∘ F \eta: \text{id}_{\mathcal{C}} \to G \circ Fη : id C → G ∘ F 和余单位 ϵ : F ∘ G → id D \epsilon: F \circ G \to \text{id}_{\mathcal{D}}ϵ : F ∘ G → id D 满足三角恒等式:
G ϵ ∘ η G = id G G\epsilon \circ \eta G = \text{id}_GG ϵ ∘ η G = id G
ϵ F ∘ F η = id F \epsilon F \circ F\eta = \text{id}_Fϵ F ∘ F η = id F
左伴随 F
右伴随 G
范畴
自由群函子
遗忘函子 U : Grp → Set U: \text{Grp} \to \text{Set}U : Grp → Set
Set ⟷ Grp
自由向量空间
遗忘 U : Vect k → Set U: \text{Vect}_k \to \text{Set}U : Vect k → Set
Set ⟷ Vectₖ
离散拓扑
遗忘 U : Top → Set U: \text{Top} \to \text{Set}U : Top → Set
Set ⟷ Top
积 ( − ) × A (-) \times A( − ) × A
Hom [ A , − ] [A, -][ A , − ]
任意有幂的闭范畴
张量积 ( − ) ⊗ A (-) \otimes A( − ) ⊗ A
[ A , − ] [A, -][ A , − ]
Vectₖ
F ⊣ G F \dashv GF ⊣ G 当且仅当存在自然变换 η : id C → G ∘ F \eta: \text{id}_{\mathcal{C}} \to G \circ Fη : id C → G ∘ F (单位),使得对每个 X ∈ Ob ( C ) X \in \text{Ob}(\mathcal{C})X ∈ Ob ( C ) 和每个 f : X → G ( Y ) f: X \to G(Y)f : X → G ( Y ) ,存在唯一 g : F ( X ) → Y g: F(X) \to Yg : F ( X ) → Y 使得 G ( g ) ∘ η X = f G(g) \circ \eta_X = fG ( g ) ∘ η X = f 。
这给出了伴随的泛元刻画 :η X : X → G ( F ( X ) ) \eta_X: X \to G(F(X))η X : X → G ( F ( X ) ) 在某种意义上是"最通用"的从 X XX 到 G GG 的像的映射。
重要事实 :左伴随保持所有存在的余极限(即 F ( colim D ) ≅ colim ( F ∘ D ) F(\text{colim} D) \cong \text{colim} (F \circ D)F ( colim D ) ≅ colim ( F ∘ D ) ),右伴随保持所有存在的极限。这提供了一种判断函子是否有左/右伴随的方法。
在 Haskell 中,curry 和 uncurry 是一对伴随:
curry :: ((a, b) -> c) -> (a -> b -> c)
uncurry :: (a -> b -> c) -> ((a, b) -> c)
这对应了指数对象 C B C^BC B 和积 B × A B \times AB × A 之间的伴随关系:( − × B ) ⊣ ( − ) B (- \times B) \dashv (-)^B( − × B ) ⊣ ( − ) B ,这正是笛卡尔闭范畴的定义。
函子 F : C → Set F: \mathcal{C} \to \text{Set}F : C → Set 称为可表示的 (Representable),如果它自然同构于某个 Hom 函子 Hom ( A , − ) \text{Hom}(A, -)Hom ( A , − ) 。此时 ( A , ρ ) (A, \rho)( A , ρ ) 称为 F FF 的表示,其中 ρ : Hom ( A , − ) ≅ F \rho: \text{Hom}(A, -) \cong Fρ : Hom ( A , − ) ≅ F 是自然同构。
由 Yoneda 引理,ρ \rhoρ 完全由 ρ A ( id A ) ∈ F ( A ) \rho_A(\text{id}_A) \in F(A)ρ A ( id A ) ∈ F ( A ) 决定,这个特殊元素称为泛元 。
函子
表示对象
含义
Hom ( G , − ) : Grp → Set \text{Hom}(G, -): \text{Grp} \to \text{Set}Hom ( G , − ) : Grp → Set
整数群 Z \mathbb{Z}Z
群同态由生成元决定
( − ) × : Ring → Set (-)^{\times}: \text{Ring} \to \text{Set}( − ) × : Ring → Set (单位群)
Z [ x , x − 1 ] \mathbb{Z}[x, x^{-1}]Z [ x , x − 1 ]
单位群泛环
P : Set op → Set \mathcal{P}: \text{Set}^{\text{op}} \to \text{Set}P : Set op → Set (幂集)
{ 0 , 1 } \{0,1\}{ 0 , 1 }
子集由特征函数决定
可表示函子是范畴论连接具体数学对象的关键桥梁。许多构造(自由对象、极限、伴随函子)都可以等价的用可表示性来刻画。例如,说"范畴 C \mathcal{C}C 中所有小极限都存在"等价于"所有 Hom ( X , − ) : C → Set \text{Hom}(X, -): \mathcal{C} \to \text{Set}Hom ( X , − ) : C → Set 的极限保持性"。
范畴上的单子由三元组 ( T , η , μ ) (T, \eta, \mu)( T , η , μ ) 构成,其中:
T : C → C T: \mathcal{C} \to \mathcal{C}T : C → C 是函子
η : id C → T \eta: \text{id}_{\mathcal{C}} \to Tη : id C → T 是单位(unit)
μ : T 2 → T \mu: T^2 \to Tμ : T 2 → T 是乘法(multiplication)
满足以下公理(类似于幺半群中的单位元和结合律,但适用于函子):
T^3 --Tμ--> T^2 T --ηT--> T^2 <--Tη-- T
| | | | |
μT μ \ μ /
v v \ v /
T^2 --- μ ---> T \ T /
\ η /
\ / /
T /
即:
μ ∘ T μ = μ ∘ μ T \mu \circ T\mu = \mu \circ \mu Tμ ∘ T μ = μ ∘ μ T (结合律)
μ ∘ η T = id T = μ ∘ T η \mu \circ \eta T = \text{id}_T = \mu \circ T\etaμ ∘ η T = id T = μ ∘ T η (单位律)
每个伴随对 ( F ⊣ G ) (F \dashv G)( F ⊣ G ) 产生一个单子 T = G ∘ F : C → C T = G \circ F: \mathcal{C} \to \mathcal{C}T = G ∘ F : C → C ,其单位和乘法为:
η : id → T \eta: \text{id} \to Tη : id → T 是伴随的单位
μ = G ϵ F : T 2 → T \mu = G\epsilon F: T^2 \to Tμ = G ϵ F : T 2 → T ,其中 ϵ \epsilonϵ 是伴随的余单位
反之,每个单子都可以由至少一个伴随对产生(有 Eilenberg-Moore 和 Kleisli 两种标准构造)。
给定单子 ( T , η , μ ) (T, \eta, \mu)( T , η , μ ) 在范畴 C \mathcal{C}C 上,Eilenberg-Moore 范畴 C T \mathcal{C}^TC T (也称为 T TT -代数范畴)以 ( A , h : T ( A ) → A ) (A, h: T(A) \to A)( A , h : T ( A ) → A ) 为对象,其中 h hh 满足:
h ∘ η A = id A h \circ \eta_A = \text{id}_Ah ∘ η A = id A
h ∘ T ( h ) = h ∘ μ A h \circ T(h) = h \circ \mu_Ah ∘ T ( h ) = h ∘ μ A
态射 f : ( A , h ) → ( B , k ) f: (A, h) \to (B, k)f : ( A , h ) → ( B , k ) 是 C \mathcal{C}C 中的态射 f : A → B f: A \to Bf : A → B ,使得 f ∘ h = k ∘ T ( f ) f \circ h = k \circ T(f)f ∘ h = k ∘ T ( f ) 。
遗忘函子 U T : C T → C U^T: \mathcal{C}^T \to \mathcal{C}U T : C T → C 有左伴随 F T F^TF T ,且由 ( F T ⊣ U T ) (F^T \dashv U^T)( F T ⊣ U T ) 生成的单子正是 T TT 。
在 Haskell 中,Monad 类型类定义如下:
class Applicative m => Monad m where
return :: a -> m a -- η
(>>=) :: m a -> (a -> m b) -> m b
-- join :: m (m a) -> m a -- μ
常见单子:
Maybe :处理可能的失败(空值)
List :非确定计算
IO :副作用管理
State :可变状态
Reader :只读环境
Writer :日志写入
Either :带错误信息的异常处理
余单子是单子的对偶:"反转所有箭头"得到的结构。余单子 ( K , ϵ , δ ) (K, \epsilon, \delta)( K , ϵ , δ ) 包括:
函子 K : C → C K: \mathcal{C} \to \mathcal{C}K : C → C
余单位 ϵ : K → id C \epsilon: K \to \text{id}_{\mathcal{C}}ϵ : K → id C
余乘法 δ : K → K 2 \delta: K \to K^2δ : K → K 2
在编程中,余单子表示"抽取值上下文"的模式。常见有余单子包括:(E, -)(Writer 对偶)、Stream(无限流)、Store(类似可以通过焦点访问的数据结构)。
Kan 扩张是许多范畴论构造的统一定义,包括极限、伴随函子、Yoneda 嵌入等。
给定函子 F : A → C F: \mathcal{A} \to \mathcal{C}F : A → C 和 K : A → B K: \mathcal{A} \to \mathcal{B}K : A → B ,F FF 沿 K KK 的左 Kan 扩张 是一个函子 Lan K F : B → C \text{Lan}_K F: \mathcal{B} \to \mathcal{C}Lan K F : B → C 加上自然变换 η : F → Lan K F ∘ K \eta: F \to \text{Lan}_K F \circ Kη : F → Lan K F ∘ K ,使得对任意其他函子 G : B → C G: \mathcal{B} \to \mathcal{C}G : B → C 和自然变换 γ : F → G ∘ K \gamma: F \to G \circ Kγ : F → G ∘ K ,存在唯一自然变换 α : Lan K F → G \alpha: \text{Lan}_K F \to Gα : Lan K F → G 使得 α K ∘ η = γ \alpha_K \circ \eta = \gammaα K ∘ η = γ 。
右 Kan 扩张 Ran K F \text{Ran}_K FRan K F 是对偶定义。
许多范畴论构造都可以视为 Kan 扩张的特例:
构造
Kan 扩张的形式
余极限
Lan Δ F \text{Lan}_{\Delta} FLan Δ F ,其中 Δ \DeltaΔ 是对角函子
极限
Ran Δ F \text{Ran}_{\Delta} FRan Δ F
左伴随
Lan K F \text{Lan}_K FLan K F 当 K KK 是恒等(K = id K = \text{id}K = id )
Yoneda 嵌入
F ( A ) → Lan Y F F(\mathcal{A}) \to \text{Lan}_{Y} FF ( A ) → Lan Y F (其中 Y YY 是 Yoneda 嵌入)
阿贝尔范畴(Abelian Category)是线性代数可以在其中进行的范畴。它是同调代数的基础。
一个范畴 A \mathcal{A}A 称为阿贝尔范畴 ,如果满足:
A \mathcal{A}A 有零对象
A \mathcal{A}A 有限二元积和余积存在(从而有限极限和余极限存在)
每个态射有核和余核
每个单态射是某个态射的核,每个满态射是某个态射的余核
一组态射 A → f B → g C A \xrightarrow{f} B \xrightarrow{g} CA f B g C 称为正合 (Exact)于 B BB ,如果 im ( f ) = ker ( g ) \text{im}(f) = \ker(g)im ( f ) = ker ( g ) 。
一个形如 0 → A → B → C → 0 0 \to A \to B \to C \to 00 → A → B → C → 0 的短正合序列满足:
A → B A \to BA → B 是单态射(核是 0 00 )
B → C B \to CB → C 是满态射(余核是 0 00 )
im ( A → B ) = ker ( B → C ) \text{im}(A \to B) = \ker(B \to C)im ( A → B ) = ker ( B → C )
在阿贝尔范畴中,给定交换图:
0 --> A' --> B' --> C' --> 0
| | |
α β γ
v v v
0 --> A --> B --> C --> 0
其中上下行都是正合序列,则存在正合序列:
ker ( α ) → ker ( β ) → ker ( γ ) → ∂ coker ( α ) → coker ( β ) → coker ( γ ) \ker(\alpha) \to \ker(\beta) \to \ker(\gamma) \xrightarrow{\partial} \text{coker}(\alpha) \to \text{coker}(\beta) \to \text{coker}(\gamma)
ker ( α ) → ker ( β ) → ker ( γ ) ∂ coker ( α ) → coker ( β ) → coker ( γ )
其中 ∂ \partial∂ 是连接态射(connecting morphism)。这一结果由"蛇形"图表追踪证明。
阿贝尔范畴是导出函子(Derived Functor)理论的基础:
Ext n ( A , B ) \text{Ext}^n(A, B)Ext n ( A , B ) 是 Hom ( − , B ) \text{Hom}(-, B)Hom ( − , B ) 沿 A AA 的右导出
Tor n ( A , B ) \text{Tor}_n(A, B)Tor n ( A , B ) 是 ( − ) ⊗ B (-) \otimes B( − ) ⊗ B 沿 A AA 的左导出
一个 2-范畴 包含:
0-细胞(对象)
1-细胞(态射,即通常的态射)
2-细胞(态射之间的态射,即自然变换的泛化)
除了标准的复合律,2-范畴还要求交换律 (Interchange Law):
( β ′ ∘ β ) ∗ ( α ′ ∘ α ) = ( β ′ ∗ α ′ ) ∘ ( β ∗ α ) (\beta' \circ \beta) * (\alpha' \circ \alpha) = (\beta' * \alpha') \circ (\beta * \alpha)
( β ′ ∘ β ) ∗ ( α ′ ∘ α ) = ( β ′ ∗ α ′ ) ∘ ( β ∗ α )
其中 ∘ \circ∘ 是垂直复合,∗ *∗ 是水平复合。
所有小范畴构成一个 2-范畴 Cat :
0-细胞:小范畴
1-细胞:函子
2-细胞:自然变换
垂直复合:自然的自然复合。水平复合:函子复合后的自然变换诱导。
严格 2-范畴 :结合律和单位律严格成立。
弱 2-范畴(双范畴) :结合律和单位律只成立到 2-同构(即自然同构)。
在大多数应用中,弱版本更自然。例如范畴的范畴 Cat 实际上是双范畴,因为函子复合的严格结合律在集合论意义下不成立。
双范畴(Bicategory) 是弱化的 2-范畴,其中:
水平复合只是在同构意义下结合:( h ∘ g ) ∘ f ≅ h ∘ ( g ∘ f ) (h \circ g) \circ f \cong h \circ (g \circ f)( h ∘ g ) ∘ f ≅ h ∘ ( g ∘ f )
单位律在同构意义下成立:f ∘ id ≅ f ≅ id ∘ f f \circ \text{id} \cong f \cong \text{id} \circ ff ∘ id ≅ f ≅ id ∘ f
这些同构满足余律条件 (Coherence Conditions):五边形公理和三角形公理
∞-范畴 (无穷范畴)是包含任意维度的态射的范畴。根据"组合"规则的不同,有多种 ∞-范畴的概念:
拟范畴(Quasi-category) :最常见的形式,用单纯集合(Simplicial Set)建模。
严格 ∞-范畴 :每一维的结合律都严格成立。
弱 ∞-范畴 :所有结合律只成立到更高维的同构。
高阶范畴是现代拓扑学、代数几何和理论物理的基础工具,在 Langlands 纲领、镜像对称等前沿领域有重要应用。
在程序语言理论中,可以将类型视为范畴的对象,纯函数视为态射:
Hask 范畴:Haskell 类型和函数
复合是函数复合:( g ∘ f ) ( x ) = g ( f ( x ) ) (g \circ f)(x) = g(f(x))( g ∘ f ) ( x ) = g ( f ( x ) )
单位态射是 id
class Functor f where
fmap :: (a -> b) -> f a -> f b
函子定律(函子必须遵守):
fmap id = id -- 保持单位态射
fmap (g . f) = fmap g . fmap f -- 保持复合
常见函子:
Maybe a:可能为空的值
[a]:列表
IO a:I/O 操作
Either e a:带错误类型的值
在 Haskell 中,参数多态函数 f :: forall a. F a -> G a 通常就是自然变换(参数性保证了自然性条件)。
自由定理 :Reynolds 的抽象定理指出,任何纯的、完全参数多态的函数自然满足自然性条件。这意味着编译器可以在不证明的情况下安全地依赖这些性质进行优化。
-- Maybe 单子处理链式空值
lookupUser :: Int -> Maybe User
lookupPost :: User -> Maybe Post
lookupComment :: Post -> Maybe Comment
getComment :: Int -> Maybe Comment
getComment uid = do
user <- lookupUser uid
post <- lookupPost user
lookupComment post
Monad 可以理解为"可编程的分号"——它允许程序员自定义计算的组合方式。这正是函数式编程中 monad 如此强大的原因:它们提供了控制流的抽象。
Haskell :从范畴论中借鉴了 Functor、Monad、Applicative、Arrow、Monoid 等概念
Scala :通过 cats 库引入范畴论概念
Rust :通过 Iterator 等 trait 体现了函子的思想
Agda/Idris :依赖类型语言将范畴论概念直接嵌入类型系统
Purescript :Haskell 风格的语言,范畴论概念更贴近实际
语言
库/框架
提供的范畴论抽象
Haskell
标准库(base)
Functor, Monad, Applicative, Monoid
Scala
Cats
完整的范畴论抽象库
Scala
ZIO
基于函子和单子的 Effect System
Rust
futures
Future = 单子(类似 Haskell 的 IO Monad)
Rust
itertools
函子化的迭代器组合
TypeScript
fp-ts
函数式编程的类型安全库
Swift
Swift 标准库
Optional / Result 等内建单子模式
Kotlin
Arrow
函数式编程库,含 Monad 等
Python
returns
类型安全的函数式库
Java
Vavr
JVM 上的函数式编程库
-- 左单位律
return a >>= f = f a
-- 右单位律
m >>= return = m
-- 结合律
(m >>= f) >>= g = m >>= (\x -> f x >>= g)
可能单子(Maybe)的验证:
maybeLeftUnit :: a -> Maybe a -> (a -> Maybe b) -> Bool
maybeLeftUnit a _ f = (return a >>= f) == f a
-- True
maybeAssoc :: Maybe a -> (a -> Maybe b) -> (b -> Maybe c) -> Bool
maybeAssoc m f g = ((m >>= f) >>= g) == (m >>= (\x -> f x >>= g))
-- True
范畴论、类型理论和逻辑之间存在深刻的对应关系:
范畴论
类型论
逻辑
对象
类型
命题
态射
函数/项
证明(蕴涵)
复合
函数复合
假言推理
积
积类型
∧(与)
余积
和类型
∨(或)
终对象
单元类型
⊤(真)
始对象
Void 类型
⊥(假)
指数对象
函数类型
→(蕴涵)
笛卡尔闭范畴
STLC
IPL(直觉主义命题逻辑)
一个范畴 C \mathcal{C}C 称为笛卡尔闭范畴 (CCC),如果:
存在二元积(终端对象 + 所有有限积)
每个对象 B BB ,函子 ( − ) × B (-) \times B( − ) × B 有右伴随 ( − ) B (-)^B( − ) B (指数对象)
CCC 对应于直觉主义逻辑 的纯类型理论(Simply Typed Lambda Calculus)。它意味着:
每个类型都可以解释为一个对象
每个项都可以解释为一个态射
每个证明对应一个构造
拓扑斯 是一种特殊的范畴,它允许在其内部发展数学理论。一个(Grothendieck)拓扑斯是 Set \text{Set}Set 的推广,在其中可以:
进行集合论推理(有幂对象、指数对象、子对象分类器)
构造内部逻辑(higher-order intuitionistic logic)
进行 Sheaf 论(层论)和逻辑验证
逻辑学家已经证明,在一个拓扑斯内部,即使排中律不成立,也可以发展全部的数学结构。这为构造性数学 和直谓主义逻辑 提供了理想的语义框架。
每个拓扑斯 E \mathcal{E}E 都有自己的内部语言 (Internal Language),即一种高阶直觉主义类型理论。它使得我们可以用"普通的"逻辑和集合论记号在拓扑斯内部推理,而不必显式地写出范畴论公式。
这在实际应用中非常有用——例如,在代数几何中,通过变换拓扑斯(即改变"层"的基底空间),同样的逻辑公式可以在不同的几何设置下解释。
入门 :能理解定义和基本示例
《Category Theory for Computing Science》- Barr & Wells
《Category Theory for Programmers》- Bartosz Milewski(有中文译本)
进阶 :能从范畴论角度思考数学
《Basic Category Theory》- Tom Leinster
《Categories for the Working Mathematician》- Mac Lane(经典,较难)
《Conceptual Mathematics》- Lawvere & Schanuel
高阶 :能开展范畴论研究或应用
《Sheaves in Geometry and Logic》- Mac Lane & Moerdijk
《Higher Topos Theory》- Jacob Lurie
nLab :范畴论的社区维基百科,覆盖面极广
Bartosz Milewski 的讲稿和视频 :编程视角的范畴论入门
Category Theory Zulip :活跃的范畴论社区论坛
The Stacks Project :代数几何中范畴论的全面参考
对象 ──→ 范畴 ──→ 函子 ──→ 自然变换
| |
v v
泛性质 Yoneda引理
|
v
极限/余极限
|
v
伴随函子
|
v
单子/余单子
|
v
Kan 扩张
|
v
2-范畴/∞-范畴
范畴论从朴素的观察出发——"关系比属性更重要"——发展出了一整套改变现代数学面貌的理论体系。它的核心贡献在于:
统一性 :将不同数学分支的共同模式提取出来,提供通用的语言和工具。
关系优先 :强调对象之间的关系而非内部结构,这导致了更抽象、更深刻的数学洞察。
泛性质 :通过外部关系唯一确定对象,避免了内部构造带来的无关细节。
伴随性 :揭示了"自由-遗忘"、"构造-保持"等普遍的对偶关系。
在编程中,范畴论提供了概念框架来理解和设计抽象接口(Functor、Monad、Applicative 等),极大地推动了纯函数式编程的发展和实用化。虽然初学者可能觉得范畴论过于抽象,但它就像"数学的望远镜"——将散落的领域收入同一视野,发现了之前无法想象的深层联系。
延伸阅读 :本文是数学知识库的一部分。了解基础数学背景可参阅集合论 和数理逻辑 ;更深入的代数结构可参阅抽象代数 。