1. 变型(variance)
很多编程语言支持子类型(subtyping)。
例如,如果Cat
是Animal
的子类型,
那么Cat
类型的表达式,就可以被用于任何Animial
类型表达式可以出现的地方。
变型(variance)指的是,复杂类型之间的子类型关系,是否会保持其元素类型之间的子类型关系。
Within the type system of a programming language, a typing rule or a type constructor is:
(1) covariant, if it preserves the ordering of types (≤), which orders types from more specific to more generic;
(2) contravariant, if it reverses this ordering;
(3) bivariant, if both of these apply (i.e., both I<A> ≤ I<B> and I<B> ≤ I<A> at the same time);
(4) invariant or nonvariant, if neither of these applies.
2. 协变类型构造器(covariant type constructor)
协变类型构造器,保持了参数类型之间的子类型关系,
例如,[Cat]
是[Animal]
的子类型,其中Cat
是Animal
的子类型,
因此,类型构造器[]
是协变的。
3. 逆变类型构造器(contravariant type constructor)
一般而言,函数f :: S1 → S2
可以安全替换函数g :: T1 → T2
,
如果与函数g
相比,函数f
接受更一般的参数类型,返回更特化的结果类型。
函数之间的子类型关系由下式确定,
S1 → S2 ≦ T1 → T2,如果T1 ≦ S1且S2 ≦ T2
逆变类型构造器,倒转了参数类型之间的子类型关系,
例如,Cat
是Animal
的子类型,但是Animal -> String
是Cat -> String
的子类型,
因此,类型构造器(-> String)
是逆变的。
参考
Haxe Manual: Type System - Variance
Wikipedia: Covariance and contravariance
Microsoft Docs: Covariance and Contravariance in Generics