Scala 正在解析选项[无]?

Scala 正在解析选项[无]?,scala,Scala,鉴于: 下面调用的输出类型如何计算为选项[无] scala> def f[F[_], A, B](x: F[A], y: F[B]): F[B] = y f: [F[_], A, B](x: F[A], y: F[B])F[B] 参见???的定义: scala> :t f( Option(42), ???) Option[Nothing] 因此F是Option而B是Nothing,因此您的返回类型是Option[Nothing],规范的这一部分在这里特别有用 发挥你的作用: de

鉴于:

下面调用的输出类型如何计算为
选项[无]

scala> def f[F[_], A, B](x: F[A], y: F[B]): F[B] = y
f: [F[_], A, B](x: F[A], y: F[B])F[B]

参见???的定义:

scala> :t f( Option(42), ???)
Option[Nothing]
因此
F
Option
B
Nothing
,因此您的返回类型是
Option[Nothing]
,规范的这一部分在这里特别有用

发挥你的作用:

def ??? : Nothing = throw new NotImplementedError
对于逆变类型,可以推断出:

scala> :t f(Option(42), ???)
Option[Nothing]

scala编译器会查找最严格的类型版本,该类型的稳定性良好。因为它找不到B(实际上没有B这类东西),所以它对不变和协变情况没有任何推断,对逆变情况也没有任何推断。

我不确定这是否真的解释了为什么
B
被推断为
Nothing
。如何从表达式
到类型
选项[Nothing]
需要更多的步骤。我认为这是编译器试图在
Any
Nothing
之间的类型层次结构中匹配类型构造函数的一个副作用
F[B]
实际上是
Nothing
,但是
Nothing
也是
选项[Nothing]
,这当然有助于编译器为
F
找到
选项的最小上界。
scala> def fAnnotated[F[_], A >: Nothing <: Any, B >: Nothing <: Any](fa: F[A], fb: F[B]): F[B] = fb
fAnnotated: [F[_], A, B](fa: F[A], fb: F[B])F[B]
scala> :t f(Option(42), ???)
Option[Nothing]
scala> trait T[-A]
defined trait T

scala> :t f(new T[Int]{}, ???)
T[Any]