Scala tipo de pregunta inferencia
-
04-10-2019 - |
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 _ => true
to 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?
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