Scala一些冗余协方差

Scala一些冗余协方差,scala,pattern-matching,option,covariance,algebraic-data-types,Scala,Pattern Matching,Option,Covariance,Algebraic Data Types,Scala标准库包含选项类型。 选项类型本身是协变类型,这一点从其声明密封抽象类选项[+A] 问题是: 为什么它的构造函数Some也是协变的 最终案例类某些[+A](x:A)扩展选项[A]? 模式匹配需要这样做吗? 或者这样做是为了更好的可读性? 对我来说,这似乎是多余的,因为除了在模式匹配中,我看不出有任何理由直接在任何地方使用Some,但目前我看不出它如何依赖于协方差。首先,你必须理解,正如@Dima所说,Some[t]不是构造函数,而是选项[t]的子类 一旦我们确定了这一点,使用Dog和A

Scala标准库包含
选项
类型。
选项类型本身是协变类型,这一点从其声明
密封抽象类选项[+A]

问题是:
为什么它的构造函数
Some
也是协变的
最终案例类某些[+A](x:A)扩展选项[A]

模式匹配需要这样做吗?
或者这样做是为了更好的可读性?


对我来说,这似乎是多余的,因为除了在模式匹配中,我看不出有任何理由直接在任何地方使用
Some
,但目前我看不出它如何依赖于协方差。

首先,你必须理解,正如@Dima所说,
Some[t]
不是构造函数,而是
选项[t]
的子类

一旦我们确定了这一点,使用
Dog
Animal
,方差问题总是更容易解决:

Some[狗]
a
Some[动物]
?我想你会同意答案是肯定的


实际上,它不会有太大的变化,因为您很少使用
Some[Dog]
,而是使用
选项[Dog]
,但它可能会发生(比如,当您不适当地使用签名返回
Some[Tuple]
的case类的
时),所以为什么不在使用它的同时添加方差呢?

它不是构造函数,这是协变的。这是实际的类
Some
。如果它不是协变的,那么
Some(“foo”)
就不会是
Some(新对象)
@Dima的子类,因为
Some(“foo”)
Some(新对象)
实际上不是类。。。但事实上,
Some[String]
Some[AnyRef]
@Dima的一个子类型是有道理的。我指的是代数数据类型的数据构造函数。请您提供一个更精确的例子,说明unapply方法。为什么不应用返回某些[Tuple]而不是选项[Tuple]?但是是的,如果我们能用协方差以防万一,为什么我们不能呢。我认为这可能还有另一个原因。一个更好的问题可能是为什么任何东西都是协变的?我的意思是,
选项
也可以是不变的。例如,在java中,所有内容都是不变的,并且可以正常工作。那么,为什么要麻烦呢?当然,答案是因为这是有道理的。如果
Dog
Animal
的子类,那么
Some[Dog]
应该是
Some[Animal]
的子类。如果不是,那就错了。@Dima我理解协方差的含义,也知道java中的一切都是不变的,所以你是说,如果没有其他原因使scala中的数据类型保持不变或逆变,那么默认情况下,scala中的数据类型是协变的,这是一条潜规则?@andrii.ilin不应该让一切都变为协变的,但是如果它通过了狗和动物的测试,通常应该是。@andrii.ilin我没有说任何潜规则:)我想说的是,如果你理解了
选项
是协变的原因,那么你也应该理解
某些
(还有
Seq
Future
等等),因为所有这些原因都是一样的——这只是从数据建模的角度来看是有意义的。