Scala类型推理问题
-
04-10-2019 - |
题
我只是在陶醉 托尼·莫里斯(Tony Morris)的精彩练习, ,当我思考以下情况下发生的事情时...
def cata[X](some: A => X, none: => X): X
现在让我称此方法如下:
def isDefined: Boolean = cata( _ => true, false)
我想知道推论者是否确定 _ => true
成为 A => Boolean
或者 Any => Boolean
. 。由于这个事实 Function1
是 反对变异 在其输入参数中,以下两个编译都很好:
def isDefined: Boolean = cata( (_: A) => true, false) //#1
def isDefined: Boolean = cata( (_: Any) => true, false) //#2
因此,问题是,类型推论器是否提出#1或#2?
解决方案
我尝试了一下:
trait MyOption[+A] {
def cata[X](some: A => X, none: => X): X
def isDefined: Boolean = cata( _ => true, false)
}
并用 scalac -Xprint:types
. 。这给出以下输出:
[[syntax trees at end of typer]]// Scala source: myoption.scala
package {
abstract trait MyOption[A >: Nothing : Nothing X, none: => X): X;
def isDefined: Boolean = MyOption.this.cata[Boolean](((x$1: A) => true), false)
}
}
因此,从外观上看,Type推论器提出了选项#1。
不隶属于 StackOverflow