当我正在思考在以下情况下发生的事情时,我只是在考虑Tony Morris' excellent exercise on catamorphisms ... ...
def cata[X](some: A => X, none: => X): X
现在让我称这个方法如下:
def isDefined: Boolean = cata( _ => true, false)
我想知道类型推断器是否将_ => true
的类型确定为A => Boolean
或Any => Boolean
。由于Function1
在其输入参数中是 contra-variant 这一事实,以下两个编译都很好:
def isDefined: Boolean = cata( (_: A) => true, false) //#1
def isDefined: Boolean = cata( (_: Any) => true, false) //#2
所以问题是,类型推断器是否提出了#1或#2?
答案 0 :(得分:7)
我试过了:
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)
}
}
因此,通过它的外观,类型推断器提出了选项#1。