2010-05-25 76 views
6

我只是慢条斯理地约与Tony Morris' excellent exercise on catamorphisms,当我思考什么在下列情况下发生......Scala的类型推断问题

def cata[X](some: A => X, none: => X): X 

现在让如下我调用这个方法:

def isDefined: Boolean = cata(_ => true, false) 

我想知道类型推理是否确定_ => true的类型为A => BooleanAny => Boolean。由于事实Function1在其输入参数禁忌变,以下两个编译就好了:

def isDefined: Boolean = cata((_: A) => true, false) //#1 
def isDefined: Boolean = cata((_: Any) => true, false) //#2 

所以现在的问题是,是否inferencer拿出#1和#2的类型?

回答

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。

+0

您正在使用哪个版本的'scalac'? – 2010-05-25 09:56:57

+0

我正在使用2.8.0 RC2 – 2010-05-25 10:48:38