给定:
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]下面调用的输出类型如何计算为Option[Nothing]
scala> :t f( Option(42), ???)
Option[Nothing]发布于 2017-02-22 09:54:45
https://www.scala-lang.org/files/archive/spec/2.12/03-types.html#conformance规范的这一部分在这里特别有用。
以您的函数为例:
scala> def f[F[_], A, B >: Nothing <: Any](fa: F[A], fb: F[B]): F[B] = fb
f: [F[_], A, B](fa: F[A], fb: F[B])F[B]编译器将其视为(或多或少):
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]因此,编译器推断您的类型的下界为Nothing,上界为Any。我们可以在您的示例中看到这一点。
scala> :t f(Option(42), ???)
Option[Nothing]并且使用逆变类型ctor可以推断出:
scala> trait T[-A]
defined trait T
scala> :t f(new T[Int]{}, ???)
T[Any]scala编译器寻找最严格的类型版本,其中soundness保持良好。由于它找不到B(实际上不存在B这样的东西),所以它对不变和协变的情况以及逆变的情况没有任何推断。
发布于 2017-02-22 03:56:16
请参见?的定义:
def ??? : Nothing = throw new NotImplementedError因此,F为Option,B为Nothing,因此您的返回类型为Option[Nothing]。
https://stackoverflow.com/questions/42376642
复制相似问题