Pregunta

Sólo estaba entretenerse con excelente ejercicio Tony Morris' en catamorphisms , cuando yo estaba pensando en lo que estaba ocurriendo en la siguiente situación ...

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

Déjame ahora llamar a este método de la siguiente manera:

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

Me preguntaba si el tipo inferencer determina el tipo de _ => trueto ser A => Boolean o Any => Boolean. Debido al hecho de que Function1 es contra-variante en su parámetro de entrada, ambos de los siguientes compilación 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 llegar a # 1 o # 2?

¿Fue útil?

Solución

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 el siguiente resultado:


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

Así que por lo visto, el tipo inferencer llegó con la opción # 1.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top