2010-05-25 88 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