首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析到Option[Nothing]?

解析到Option[Nothing]?
EN

Stack Overflow用户
提问于 2017-02-22 03:50:35
回答 2查看 92关注 0票数 0

给定:

代码语言:javascript
复制
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]

代码语言:javascript
复制
scala> :t f( Option(42), ???)
Option[Nothing]
EN

回答 2

Stack Overflow用户

发布于 2017-02-22 09:54:45

https://www.scala-lang.org/files/archive/spec/2.12/03-types.html#conformance规范的这一部分在这里特别有用。

以您的函数为例:

代码语言:javascript
复制
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]

编译器将其视为(或多或少):

代码语言:javascript
复制
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。我们可以在您的示例中看到这一点。

代码语言:javascript
复制
scala> :t f(Option(42), ???)
Option[Nothing]

并且使用逆变类型ctor可以推断出:

代码语言:javascript
复制
scala> trait T[-A]
defined trait T

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

scala编译器寻找最严格的类型版本,其中soundness保持良好。由于它找不到B(实际上不存在B这样的东西),所以它对不变和协变的情况以及逆变的情况没有任何推断。

票数 1
EN

Stack Overflow用户

发布于 2017-02-22 03:56:16

请参见?的定义:

代码语言:javascript
复制
def ??? : Nothing = throw new NotImplementedError

因此,FOptionBNothing,因此您的返回类型为Option[Nothing]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42376642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档