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(跟型別參數反方向)

本質是一樣的——當你「套一層」的時候,方向性可能保持或翻轉,取決於那一層的結構。

Related Posts