2010-05-25 12 views
6

I właśnie o garnki z Tony Morris' excellent exercise on catamorphisms, kiedy zastanawiałem się, co dzieje się w następującej sytuacji ...Scala rodzaj wnioskowania pytanie

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

Pozwól teraz wywołać tę metodę w następujący sposób:

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

Zastanawiam się, czy inferencer typów określa typ _ => true na A => Boolean lub Any => Boolean. Ze względu na fakt, że Function1 jest przeciwwskazane wariant w parametrze wejściowym, oba z następujących kompilacji dobrze:

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

Więc pytanie brzmi, czy typ inferencer wymyślić nr 1 lub nr 2?

Odpowiedz

7

Próbowałem to uwagę:


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

i skompilowany to z scalac -Xprint:types. Dało to następujące dane wyjściowe:


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

Tak więc wyglądał na to, że w inferencer typu pojawiła się opcja # 1.

+0

Którą wersję 'skalaka' używasz? –

+0

Używam 2.8.0 RC2 –