2010-05-25 16 views
6

ich mit Tony Morris' excellent exercise on catamorphisms nur Werkeln im Begriff war, als ich grübelte, was in der folgenden Situation geschah ...Scala Typinferenz Frage

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

Lassen Sie mich diese Methode nun wie folgt aufrufen:

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

Ich frage mich, ob der Typ Inferenz den Typ _ => true zu A => Boolean oder Any => Boolean bestimmt. Aufgrund der Tatsache, dass Function1kontravarianten in seinem Eingabeparameter ist, fein beiden folgenden kompilieren nur:

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

Die Frage ist also, wird der Typen mit # 1 oder # 2 Rückschließer kommen?

Antwort

7

Ich habe versucht, dies aus:


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

und dies mit scalac -Xprint:types zusammengestellt. Dies ergab die folgende Ausgabe:


[[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) 
    } 
} 

So von den Blicken von ihm, kam der Typ 1 mit Rückschließer Option # up.

+0

Welche Version von 'scalac' verwenden Sie? –

+0

Ich benutze 2.8.0 RC2 –