是否有可能统一继承和参数多态的概念?

soc*_*soc 5 language-agnostic polymorphism types programming-languages variance

我想知道是否通常可以统一继承和参数多态("泛型")的概念,特别是关于方差,但也包括如何("语法")和他们将在哪里(使用网站/声明 - 网站)定义?

考虑这一观点:

  • 子类型例如S <: T可以被视为共变体行为,因为接受的输入参数T也将接受S.
  • 将"继承模型的方差"更改为不变量只能在定义方面通过禁止子类型(例如向final类定义添加修饰符)来实现,就大多数情况而言,反差异是不可能的.
  • 参数多态性在默认情况下是不变的,但可以是共变体/反变体

考虑到两者之间似乎存在不可忽视的概念不匹配

  • 允许"不安全"的协方差(例如String[] <: Object[]在Java/C#中)产生的痛苦语言
  • 与继承相比,声明和使用继承/参数多态的方式不同

在某些语言中,可以看出,两者都可以很好地协同工作

class Foo extends Ordered[Foo]
Run Code Online (Sandbox Code Playgroud)

实现排序/比较行为.

  • 可以想象,继承和参数多态的概念可以统一并获得相同的默认方差行为(例如,默认情况下的协方差,或者会导致必须使用不变性注释标记大多数类型,因此只是将丑陋移到另一个点)?这是否更实际,好像数据结构在默认情况下也会变得不可变?
  • 是否有一个正式的系统,其中已证明这是合理的?
  • 无论具体的编程语言如何,最有可能需要哪些语法选项/更改?
  • 是否有一些工作示例或语言,这种/类似的东西已经在工作?

n. *_* m. 4

协变/逆变通常就是指这一点。假设X, Y,Z是类型。进一步假设a \xe2\x86\x92 b表示一个函数类型,其参数为 type a,结果为 type b<:表示子类型关系,或者可能是“一致性”的其他概念。\xe2\x87\x92 箭头显示“entails”。那么下面的结论成立:

\n\n
X <: Y \xe2\x87\x92 (Z \xe2\x86\x92 X) <: (Z \xe2\x86\x92 Y)\nX <: Y \xe2\x87\x92 (Y \xe2\x86\x92 Z) <: (X \xe2\x86\x92 Z)\n
Run Code Online (Sandbox Code Playgroud)\n\n

也就是说,函数类型构造函数对于结果类型(数据源)是协变的,对于参数类型(数据接收器)是逆变的。这是一个基本事实,你或多或少不能对此做任何太有创意的事情,比如反转箭头的方向。当然,您始终可以使用无方差来代替协方差或逆变(大多数语言都是如此)。

\n\n

对象类型可以使用函数类型进行规范编码,因此这里也没有太多自由。每个类型参数代表数据源(协变)或数据接收器(逆变)或两者(协变)。如果它在一种语言中是健全且逆变的,那么在另一种语言中它要么是逆变的,要么是不健全的。

\n\n

我认为 Scala 在这方面非常接近理想的语言。您引用了一个看起来很像 Scala 的示例,因此您很可能熟悉该语言。我想知道为什么您认为它的类型系统仅在某些情况下才能正常工作。其他情况又是怎样的呢?

\n\n

每个有抱负的语言设计师都应该阅读的一本理论著作是 Luca Cardelli 的《对象理论》。

\n