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)
实现排序/比较行为.
协变/逆变通常就是指这一点。假设X, Y,Z是类型。进一步假设a \xe2\x86\x92 b表示一个函数类型,其参数为 type a,结果为 type b。<:表示子类型关系,或者可能是“一致性”的其他概念。\xe2\x87\x92 箭头显示“entails”。那么下面的结论成立:
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)\nRun Code Online (Sandbox Code Playgroud)\n\n也就是说,函数类型构造函数对于结果类型(数据源)是协变的,对于参数类型(数据接收器)是逆变的。这是一个基本事实,你或多或少不能对此做任何太有创意的事情,比如反转箭头的方向。当然,您始终可以使用无方差来代替协方差或逆变(大多数语言都是如此)。
\n\n对象类型可以使用函数类型进行规范编码,因此这里也没有太多自由。每个类型参数代表数据源(协变)或数据接收器(逆变)或两者(协变)。如果它在一种语言中是健全且逆变的,那么在另一种语言中它要么是逆变的,要么是不健全的。
\n\n我认为 Scala 在这方面非常接近理想的语言。您引用了一个看起来很像 Scala 的示例,因此您很可能熟悉该语言。我想知道为什么您认为它的类型系统仅在某些情况下才能正常工作。其他情况又是怎样的呢?
\n\n每个有抱负的语言设计师都应该阅读的一本理论著作是 Luca Cardelli 的《对象理论》。
\n