跳转到内容

面向类型编程/类型变异

来自维基教科书,开放世界中的开放书籍

考虑以下类型层次结构

type A {}

type B : A {}

type F[T] {}

在没有类型参数的情况下,F 是一个类型运算符,而 F[A]F[B] 是适当的类型。通常,两者都不是对方的子类型。但是,根据其参数的层次结构,它们有时可能在子类型关系中是有意义的。如果我们按如下方式声明 F

type F[cov T] {}

那么 F[B] 将是 F[A] 的子类型,因为 BA 的子类型。相反,如果我们声明 F

type F[con T] {}

那么 F[A] 将是 F[B] 的子类型。在前面的情况下,我们说 F 在其类型参数中是协变的,而在后面的情况下,它是逆变的(因为层次结构被反转)。

类型变异的一个现实世界例子是函数类型。当我们期望一个返回类型为 A 的函数(即类型为 Func[A] 的函数)时,我们始终可以使用类型为 Func[B] 的函数来代替它。另一方面,当我们期望一个参数类型为 B 的函数(即类型为 Func[B,X] 的函数)时,我们始终可以使用类型为 Func[A,X] 的函数来代替它。总而言之,函数类型在其返回类型中是协变的,在其参数类型中是逆变的。

注意:可以使用 Funcy 应用程序试用伪代码,该应用程序可以从 Apple 的 App Store (iOS/macOS)Google Play (Android)亚马逊应用商店 免费下载。要执行的代码必须放置在 main {} 块中。

华夏公益教科书