2010-05-25 15 views
6

ero solo pottering circa con Tony Morris' excellent exercise on catamorphisms, quando stavo riflettendo quello che stava accadendo nella seguente situazione ...Scala domanda inferenza di tipo

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

Permettetemi ora di chiamare questo metodo come segue:

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

Mi chiedevo se il tipo di iniziatore determina il tipo di _ => true da A => Boolean o Any => Boolean. A causa del fatto che Function1 è contropartita variante nel suo parametro di ingresso, entrambe le seguenti compilare bene:

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

Quindi la domanda è, fa il tipo inferencer venire con 1 # o # 2?

risposta

7

ho provato questo fuori:


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

e compilati questo con scalac -Xprint:types. Ciò ha dato il seguente output:


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

Quindi, a giudicare dall'aspetto, il tipo di inferenza ha avuto l'opzione 1.

+0

Quale versione di 'scalac' stai usando? –

+0

Sto usando 2.8.0 RC2 –