Scala 一些冗余协方差
Scala Some redundant covariance
Scala 标准库包含 Option
类型。
Option 类型本身是协变类型,这一点从它的声明 sealed abstract class Option[+A]
.
可以看出
问题是:
为什么它的构造函数 Some
也是协变的
final case class Some[+A](x: A) extends Option[A]
?
这是模式匹配所必需的吗?
或者可能是为了更好的可读性?
对我来说,这似乎是多余的,因为除了模式匹配之外,我看不出有任何理由直接在任何地方使用 Some
,但目前我看不出它如何依赖于协方差。
首先,您必须明白,正如@Dima 所说,Some[T]
不是构造函数,而是 Option[T]
.
的子class
一旦我们确定了这一点,带有方差的问题总是更容易用 Dog
和 Animal
解决:
Some[Dog]
是 Some[Animal]
吗?我想你会同意答案是肯定的。
实际上,它不会有太大变化,因为你很少使用 Some[Dog]
,而是使用 Option[Dog]
,但它可能会发生(比如当你使用 unapply
的案例 class 其签名 returns a Some[Tuple]
),那么为什么不在我们处理它时添加方差?
Scala 标准库包含 Option
类型。
Option 类型本身是协变类型,这一点从它的声明 sealed abstract class Option[+A]
.
问题是:
为什么它的构造函数 Some
也是协变的
final case class Some[+A](x: A) extends Option[A]
?
这是模式匹配所必需的吗?
或者可能是为了更好的可读性?
对我来说,这似乎是多余的,因为除了模式匹配之外,我看不出有任何理由直接在任何地方使用 Some
,但目前我看不出它如何依赖于协方差。
首先,您必须明白,正如@Dima 所说,Some[T]
不是构造函数,而是 Option[T]
.
一旦我们确定了这一点,带有方差的问题总是更容易用 Dog
和 Animal
解决:
Some[Dog]
是 Some[Animal]
吗?我想你会同意答案是肯定的。
实际上,它不会有太大变化,因为你很少使用 Some[Dog]
,而是使用 Option[Dog]
,但它可能会发生(比如当你使用 unapply
的案例 class 其签名 returns a Some[Tuple]
),那么为什么不在我们处理它时添加方差?