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]