Scala类型推断问题

oxb*_*kes 6 scala type-inference catamorphism

当我正在思考在以下情况下发生的事情的时候,我只是对托尼·莫里斯对猫咪的优秀演习进行了喋喋不休的讨论 ......

def cata[X](some: A => X, none: => X): X
Run Code Online (Sandbox Code Playgroud)

现在让我称这个方法如下:

def isDefined: Boolean = cata( _ => true, false)
Run Code Online (Sandbox Code Playgroud)

我想知道的类型是否inferencer确定的类型的_ => trueA => BooleanAny => Boolean.由于输入参数Function1反变量的事实,以下两个编译都很好:

def isDefined: Boolean = cata( (_: A) => true, false)    //#1
def isDefined: Boolean = cata( (_: Any) => true, false)  //#2
Run Code Online (Sandbox Code Playgroud)

所以问题是,类型推断器是出现#1还是#2?

Arj*_*ijl 7

我试过这个:


trait MyOption[+A] {
   def cata[X](some: A => X, none: => X): X
   def isDefined: Boolean = cata( _ => true, false)
}
Run Code Online (Sandbox Code Playgroud)

用这个编译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)
  }
}
Run Code Online (Sandbox Code Playgroud)

所以从它的外观来看,类型推理器提出了选项#1.