面向类型编程/类型变异
外观
< 面向类型编程
考虑以下类型层次结构
type A {} type B : A {} type F[T] {}
在没有类型参数的情况下,F
是一个类型运算符,而 F[A]
和 F[B]
是适当的类型。通常,两者都不是对方的子类型。但是,根据其参数的层次结构,它们有时可能在子类型关系中是有意义的。如果我们按如下方式声明 F
type F[cov T] {}
那么 F[B]
将是 F[A]
的子类型,因为 B
是 A
的子类型。相反,如果我们声明 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 {}
块中。