[PLT] Variance

1. 变型(variance)

很多编程语言支持子类型(subtyping)。

例如,如果CatAnimal的子类型,
那么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 ≤ I and I ≤ I at the same time);
(4) invariant or nonvariant, if neither of these applies.

2. 协变类型构造器(covariant type constructor)

协变类型构造器,保持了参数类型之间的子类型关系,
例如,[Cat][Animal]的子类型,其中CatAnimal的子类型,
因此,类型构造器[]协变的

3. 逆变类型构造器(contravariant type constructor)

一般而言,函数f :: S1 → S2可以安全替换函数g :: T1 → T2
如果与函数g相比,函数f接受更一般的参数类型,返回更特化的结果类型。

函数之间的子类型关系由下式确定,

S1 → S2 ≦ T1 → T2,如果T1 ≦ S1且S2 ≦ T2

逆变类型构造器,倒转了参数类型之间的子类型关系,
例如,CatAnimal的子类型,但是Animal -> StringCat -> String的子类型,
因此,类型构造器(-> String)逆变的


参考

Haxe Manual: Type System - Variance
Wikipedia: Covariance and contravariance
Microsoft Docs: Covariance and Contravariance in Generics

你可能感兴趣的:([PLT] Variance)