現代靜態類型 OO 語言(C#、Haskell、ManagedX)的核心類型系統建立在三大支柱之上:**物件類型**、**函數類型**、**介面類型**,輔以**泛型**與**延遲綁定**兩大修飾機制。本文從語義分析器實作視角,形式化定義類型運算規則,揭示泛型實例化、繼承鏈解析、成員類型推導的底層邏輯。
對任意類型 T,定義兩個核心屬性:
this(T):類型自身在成員內部的視角(C# this、C++ *this)base(T):直接父類類型(僅物件類型擁有,介面/函數類型無 base)
// 範例
class T : U, I1, I2 {}
this(T) = T
base(T) = U // 唯一非介面父類
引入三個元運算:
decl(T[A,B]) → T[U,V]:取得泛型聲明(擦除實參)params(T[A,B]) → {U↦A, V↦B}:提取型別映射表replace(Type, Map):將聲明中的型別參數替換為實參基本恆等式:
replace(this(decl(T)), params(T)) == T
// 實例類型 = 聲明中的 this 套用實參映射
場景:Derived<int, string> : Base<U> : IEnumerable<T>
求 Derived<int,string> 的 GetEnumerator 返回類型:
// 1. 找父類 Base
tm1 = params(Derived) = {T↦int, U↦string}
tb = base(decl(Derived)) = Base
B = replace(tb, tm1) = Base
// 2. 找介面 IEnumerable
tm2 = params(Base) = {T↦string}
It = replace(IEnumerable, tm2) = IEnumerable
// 3. 找成員返回類型 IEnumerator
R = replace(IEnumerator, tm2) = IEnumerator
核心規則:沿繼承鏈向上,每層套用當層的 params 映射。
C++ 實作中,類型以複雜結構體指標表示。為達 O(1) 類型比較:
ptr(A) == ptr(B) ⇔ A ≡ B六大核心函數:this_type、base_type、decl_type、params_map、replace、replace_by_type = replace(A, params(B))。
函數類型推導涉及:
var、Haskell 型別推論)ManagedX 核心庫 System.CoreManaged 暫不需 Lambda,故此部分留待後續里程碑。
類型系統的本質是約束傳播與替換運算。將直覺上的「繼承」、「泛型實例化」、「介面實現」形式化為 this/base/decl/params/replace 五大運算,不僅指導編譯器實作,更能幫助語言設計者發現類型系統的邊界與矛盾。下一步:函數類型的完整代數結構。