2010-05-25 21 views
6

Estaba a entretenerse con Tony Morris' excellent exercise on catamorphisms, cuando yo estaba pensando en lo que estaba ocurriendo en la siguiente situación ...Scala pregunta inferencia de tipos

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

Permítanme ahora llamar a este método de la siguiente manera:

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

Me preguntaba si el tipo inferencer determina que el tipo de _ => true es A => Boolean o Any => Boolean. Debido al hecho de que Function1 es contra-variante en su parámetro de entrada, ambos de los siguientes compilar bien:

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

Así que la pregunta es, ¿el tipo inferencer subir con # 1 o # 2?

Respuesta

7

He intentado esto:


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

y compilado esto con scalac -Xprint:types. Esto dio la siguiente salida:


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

Por lo que parece, el tipo inferencer se le ocurrió la opción # 1.

+0

¿Qué versión de 'scalac' estás usando? –

+0

Estoy usando 2.8.0 RC2 –

Cuestiones relacionadas