Covariant 與 Contravariant:一個量尺類比
· 3 min read
困惑的起點
Covariant 和 contravariant 是數學和物理中極容易讓人困惑的概念。教科書上的定義通常是:
Covariant:跟基底變換方向相同。Contravariant:跟基底變換方向相反。
但什麼叫「方向相同」?相同的又是什麼?讓我用一個更直觀的類比來說明。
量尺類比
想像你在量一張桌子的長度。你手上有一把尺,刻度是公分。桌子量出來是 120 公分。
現在把尺換成公尺尺——基底單位變大了(1 公尺 vs 1 公分)。同一張桌子,量出來變成 1.2 公尺。
注意這裡的關係:
- 基底(單位)變大了 100 倍
- 座標(數值)變小了 100 倍
座標與基底反向變化——這就是 contravariant。向量的分量就是 contravariant 的。
那什麼是 Covariant?
考慮一個線性函數(或稱 1-form)——它吃一個向量,吐出一個數字。例如「投影到 x 軸」這個操作。
當基底變大時,這個線性函數的「係數」也跟著變大——因為它需要 compensate 向量分量的縮小,才能讓最終的數值保持不變。
係數與基底同向變化——這就是 covariant。
數學表達
設基底變換矩陣為 A(舊基底 → 新基底),則:
- Contravariant 向量分量:
v' = A⁻¹ v(反向變換) - Covariant 分量(1-form 係數):
ω' = ω A(正向變換)
兩者的配對(inner product)保持不變:ω' · v' = ω A · A⁻¹ v = ω · v。
這個不變性才是重點——物理量不依賴於座標選擇。Covariant 和 contravariant 的區分只是達成這個不變性的數學機制。
在程式中的類比
如果你學過 TypeScript 或 Scala 的型別系統,covariance 和 contravariance 也出現在泛型中:
Array<Dog>是Array<Animal>的子型別?→ Covariant(跟型別參數同方向)(Animal) => void是(Dog) => void的子型別?→ Contravariant(跟型別參數反方向)
本質是一樣的——當你「套一層」的時候,方向性可能保持或翻轉,取決於那一層的結構。