跳轉到

1945 - Eilenberg–MacLane《General Theory of Natural Equivalences》#

案件摘要#

1945 年,Samuel Eilenberg 與 Saunders MacLane 發表《General Theory of Natural Equivalences》,正式建立範疇、函子與自然變換的理論。偵探的結論:這樁案子起初只是為了把「自然同構」說清楚,最後卻發明了一套統攝全部數學的語言。

前因 -- 為什麼會有這個案子#

  • 代數拓撲的語言危機:1940 年代,代數拓撲學家為拓撲空間 \(X\) 配備各種代數不變量:同調群 \(H_n(X)\) 、上同調群 \(H^n(X; G)\) 、基本群 \(\pi_1(X)\) 。但「這些不變量之間的映射是自然的」這句話被到處使用,卻從未被嚴格定義。
  • Eilenberg–MacLane 的線索:兩人在 1942 年研究群擴張與上同調時,已隱約感到需要「結構之間的結構」。MacLane 回憶:他們發明了「範疇」與「函子」,卻沒有發明「自然變換」——是自然變換自己找上門的。
  • 偵探的疑問:什麼是「自然的」映射?答案不是一個性質,而是一層新的抽象:結構之間保持結構的映射,以及映射之間保持映射的變換。

線索與推理 -- 數學式、程式、理論#

線索一:範疇 \(\mathcal{C}\) ——物件 + 態射 + 複合#

範疇由以下資料構成: 1. 物件類 \(\operatorname{Ob}(\mathcal{C})\) ; 2. 每對物件 \((A, B)\) 有一個態射集 \(\operatorname{Hom}_{\mathcal{C}}(A, B)\) ; 3. 複合 \(\circ: \operatorname{Hom}(B, C) \times \operatorname{Hom}(A, B) \to \operatorname{Hom}(A, C)\) ,滿足結合律; 4. 每個物件有恆等態射 \(\operatorname{id}_A\) ,滿足 \(f \circ \operatorname{id}_A = f = \operatorname{id}_B \circ f\) 。

範例: - Set:集合與映射;Grp:群與群同態 \(\varphi(ab) = \varphi(a)\varphi(b)\) ;Top:拓撲空間與連續映射;Vect:向量空間與線性映射;Ring:交換環與環同態。 - 推理:範疇是「群論公理化」(Weber 1893)方法的極致——連「集合與映射」都被抽象成一個物件,數學本身成為自己的研究對象。態射的複合滿足結合律,正呼應 Cayley 矩陣乘法 \((AB)C = A(BC)\) 的代數基因。

線索二:函子 \(F: \mathcal{C} \to \mathcal{D}\) ——結構之間的映射#

函子:範疇之間的映射 \(F: \mathcal{C} \to \mathcal{D}\) ,滿足: 1. 對物件: \(A \mapsto F(A)\) ; 2. 對態射: \(f: A \to B \mapsto F(f): F(A) \to F(B)\) ; 3. 保持複合: \(F(f \circ g) = F(f) \circ F(g)\) ; 4. 保持恆等: \(F(\operatorname{id}_A) = \operatorname{id}_{F(A)}\) 。

範例: - 基本群函子 \(\pi_1: \mathbf{Top}_* \to \mathbf{Grp}\) ; - 同調函子 \(H_n: \mathbf{Top} \to \mathbf{Ab}\) ; - 遺忘函子 \(U: \mathbf{Grp} \to \mathbf{Set}\) ; - 自由函子 \(F_{\text{free}}: \mathbf{Set} \to \mathbf{Grp}\) ( \(F_{\text{free}}(S)\) 是 \(S\) 生成的自由群)。

推理:函子把「數學結構的轉換」變成數學研究的對象——這正是代數拓撲最需要的語言: \(H_n\) 是函子,故連續映射 \(f: X \to Y\) 自動誘導群同態 \(H_n(f): H_n(X) \to H_n(Y)\) ,「不變量的誘導映射」從此有嚴格定義。

線索三:自然變換 \(\eta: F \to G\) ——「自然」的嚴格定義#

自然變換:兩個函子 \(F, G: \mathcal{C} \to \mathcal{D}\) 之間的映射族 \(\eta = \{ \eta_A \}_{A \in \operatorname{Ob}(\mathcal{C})}\) ,其中 \(\eta_A: F(A) \to G(A)\) ,滿足自然性方塊:對每個態射 \(f: A \to B\) ,

\[ G(f) \circ \eta_A = \eta_B \circ F(f) \]

範例:向量空間 \(V\) 與其雙對偶 \(V^{**}\) 之間的自然嵌入 \(\eta_V: V \to V^{**}\) ;而 \(V \to V^*\) 則「不自然」(需選基底)——這正是 Eilenberg–MacLane 想捕捉的區別。

函子範疇:所有函子 \(\mathcal{C} \to \mathcal{D}\) 與自然變換本身構成範疇 \(\mathcal{D}^{\mathcal{C}}\) ——數學的抽象層次可以無限堆疊。

線索四:Yoneda 引理——範疇論的心臟#

Yoneda 引理:對範疇 \(\mathcal{C}\) 、物件 \(A\) 與函子 \(F: \mathcal{C} \to \mathbf{Set}\) ,存在雙射(且自然):

\[ \operatorname{Nat}(\operatorname{Hom}(A, -),\, F) \;\cong\; F(A) \]

其中 \(\operatorname{Hom}(A, -)\) 是可表函子。推理:Yoneda 引理說「一個物件由它與其他物件的關係完全決定」——這是結構主義哲學的定理化身,也是表示理論、層論、米田嵌入的基礎。它與 Cayley 定理(抽象群 ≅ 置換群)精神相通:認識一個數學物件,就看它如何作用於世界。

線索五:範疇論與函數式編程(Haskell typeclass)#

範疇論成為 Haskell 與函數式編程的理論基礎(與 lambda 演算書交叉參照:lambda 演算提供「計算模型」,範疇論提供「程序組合的代數」): - 函子(Functor):Haskell 的 Functor typeclass 對應協變函子:

class Functor f where
  fmap :: (a -> b) -> f a -> f b
-- functor 定律:fmap id = id;fmap (g . h) = fmap g . fmap h
這正是函子公理 \(F(\operatorname{id}) = \operatorname{id}\) 、 \(F(f \circ g) = F(f) \circ F(g)\) 的程式化身。 - 單子(Monad):Haskell 的 Monad typeclass 對應範疇論中的 monad(Kleisli 三元組 \((T, \mu, \eta)\) ,含單位 \(\eta: \mathrm{Id} \to T\) 與乘法 \(\mu: T^2 \to T\) ):
class Functor m => Monad m where
  return :: a -> m a                      -- 對應 η
  (>>=)  :: m a -> (a -> m b) -> m b      -- 對應 Kleisli 擴張
monad 用於處理副作用(Maybe、IO、State),Wadler 的名言:「單子不過是自函子範疇中的么半群」正是範疇論語言的程式回響。

Python 實作:簡單函子與單子(monad)概念#

from typing import Callable, Generic, TypeVar
A, B = TypeVar("A"), TypeVar("B")

# ── Maybe 單子:對應範疇論的 monad (T, η, μ) ──
class Maybe(Generic[A]):
    def __init__(self, value: A | None): self.value = value

def unit(x):                       # η : Id -> Maybe(return)
    return Maybe(x)

def bind(m, f: Callable):          # >>= : Kleisli 擴張
    return m.value if m.value is None else f(m.value)

def fmap(f: Callable, m):          # Functor: fmap :: (a->b) -> m a -> m b
    return m if m.value is None else Maybe(f(m.value))

# 函子定律驗證:fmap id = id;fmap (g∘h) = fmap g ∘ fmap h
x = unit(3)
print("fmap id = id :", fmap(lambda v: v, x).value == x.value)
g, h = lambda v: v + 1, lambda v: v * 2
print("組合律      :", fmap(g, fmap(h, x)).value == fmap(lambda v: g(h(v)), x).value)

# 單子用於鏈式計算:除以 0 時安全傳播 None
safe_div = lambda b: (lambda a: Maybe(a / b) if b != 0 else Maybe(None))
result = bind(bind(unit(10), safe_div(2)), safe_div(0))
print("10 / 2 / 0 =", result.value)      # None,錯誤安全傳播
程式把 1945 年的抽象定義化為可執行的程式碼:fmap 是函子,unit 與 bind 是單子——範疇論不只是拓撲學家的語言,也是程式設計師的日常。

結案 -- 後果與影響#

  • 代數拓撲與同調代數的標準語言: derived functor、Ext、Tor、譜序列全部以範疇語言表述;Grothendieck 的概形理論(1957–60)以範疇與函子為骨架,將其推向代數幾何的中心。
  • 數學的統一語言:範疇論讓「群、環、拓撲空間、序結構」可以被同一套語言描述,Bourbaki 的結構主義在其手中達到抽象頂點。
  • 電腦科學的意外收穫:Haskell typeclass、monad、函數式編程的理論基礎皆來自範疇論;lambda 演算與笛卡兒封閉範疇的對應(Curry–Howard–Lambek)是理論電腦科的基石。
  • 結案陳詞:Eilenberg 與 MacLane 本來只想把「自然」二字定義清楚,卻偵破了數學最大的懸案——存在一個統攝一切數學結構的語言。這樁案子的深遠影響,從拓撲學一路延伸到程式設計。

關鍵人物與文獻#

  • Samuel Eilenberg (1913–1998):波蘭裔美國數學家,哥倫比亞大學,代數拓撲與自動機理論先驅。
  • Saunders MacLane (1909–2005):美國數學家,芝加哥大學,範疇論共同創始人。
  • Eilenberg, S. & MacLane, S. (1945). General Theory of Natural Equivalences. Trans. Amer. Math. Soc. 58, 231–294.
  • Eilenberg, S. & MacLane, S. (1942). Natural isomorphisms in group theory.(前奏論文)
  • MacLane, S. (1971). Categories for the Working Mathematician.(範疇論標準教科書)
  • 交叉參照:1858-Cayley矩陣.md(結合律的基因)、1893-抽象群公理化.md(公理化方法)、1930-VanderWaerden近代代數.md(結構主義)、lambda 演算書(Curry–Howard–Lambek 對應)。