当前位置: 首页 > 知识库问答 >
问题:

Scala中的协方差

朱鸿畅
2023-03-14

我正在学习Scala中的函数式编程原理,在学习子类型和泛型时,我对协方差有一个困惑:

给定:nonempty<:intsetnonemptyintset的子类型

val nonEmpty: List[NonEmpty] = null
val intSet: List[IntSet] = nonEmpty 

编辑:

下面是intset,NonEmpty,list的定义:

abstract class IntSet {
  def contains(x: Int): Boolean
  def incl(x: Int): IntSet
  def union(other: IntSet): IntSet
}

class NonEmpty(elem: Int, left: IntSet, right: IntSet) extends IntSet {...}

trait List[T] {
  def isEmpty: Boolean
  def head: T
  def tail: List[T]
}

共有1个答案

黎浩然
2023-03-14

问题在于您对列表的定义;它的类型参数没有前缀+以指示类型参数是协变的。将其更改为:

trait List[+T] {
  def isEmpty: Boolean
  def head: T
  def tail: List[T]
}
 类似资料:
  • 问题内容: 谁能解释我,编程语言理论中协变和逆变的概念吗? 问题答案: 协方差 非常简单,最好从某些收集类的角度来考虑。我们可以 参数化 的一些类型参数类。也就是说,我们的列表包含some 类型的元素。如果,列表将是协变的 S是Tiff列表的子类型List [S]是List [T]的子类型 (在这里,我使用数学定义 iff 表示 当且仅当 。) 也就是说,a 是一个 。如果有一些例程接受a 作为参

  • 这可能是一个很傻的问题,但我挠头了很久也弄不明白其中的区别。 我正在浏览scala泛型页面:https://docs.scala-lang.org/tour/generic-classes.html 注意:泛型类型的子类型是不变的。这意味着,如果我们有一个stack[Char]类型的字符堆栈,那么它就不能用作stack[Int]类型的整数堆栈。这是不合理的,因为它使我们能够将真整数输入到字符堆栈中

  • 问题内容: 协方差(大致)是在使用它们的复杂类型中 镜像 “简单”类型的 继承 的能力。 例如,我们始终可以将的实例视为的实例。如果ComplexType是协变的,则可以将A 视为a 。 我想知道:协方差的“类型”是什么,它们与C#有什么关系(是否支持它们?) 代码示例将很有帮助。 例如,一种类型是Java支持的 返回类型covariance ,但C#不支持。 我希望有功能编程知识的人也能加入!

  • 你能解释一下第一行最后一个false输出,为什么它不是真的吗?

  • 我需要在控制台上打印大量的数据(大约100兆)。在IntelliJ上使用println是很失败的。有没有像console.log这样的替代方案,可以处理和显示这些数据而不会出现滞后和减慢? 提前道谢!

  • 问题内容: 请显示一个有关Java中协方差和逆方差的好例子。 问题答案: 协方差: Sub#getSomething是协变的,因为它返回Super#getSomething的返回类型的子类(但完全填充了Super.getSomething()的协定) 逆差 Sub#doSomething是互变的,因为它采用了Super#doSomething的参数的超类的参数(但是,再次填充了Super#doSo