2010-05-25 2 views
6

Я был просто возится с о Tony Morris' excellent exercise on catamorphisms, когда я размышлял, что происходит в следующей ситуации ...Scala тип умозаключение вопрос

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

Позвольте мне теперь называть этот метод следующим образом:

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

Мне было интересно, определяет ли тип inferencer тип _ => true как A => Boolean или Any => 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) 
    } 
} 

Таким образом, при взгляде на него тип inferencer придумал вариант №1.

+0

Какую версию 'scalac' вы используете? –

+0

Я использую 2.8.0 RC2 –

Смежные вопросы