Scala d'inférence de type question
-
04-10-2019 - |
Question
Je viens de PÖTTERING à propos avec un excellent Tony Morris exercice sur catamorphisme , quand je réfléchissais à ce qui se passait dans la situation suivante ...
def cata[X](some: A => X, none: => X): X
Permettez-moi maintenant appeler cette méthode comme suit:
def isDefined: Boolean = cata( _ => true, false)
Je me demandais si le type inferencer détermine le type de _ => true
to être A => Boolean
ou Any => Boolean
. En raison du fait que Function1
est contra-variante dans son paramètre d'entrée, à la fois de la compilation suivante très bien:
def isDefined: Boolean = cata( (_: A) => true, false) //#1
def isDefined: Boolean = cata( (_: Any) => true, false) //#2
La question est, est-ce le type inferencer venir avec # 1 ou # 2?
La solution
J'ai essayé ceci:
trait MyOption[+A] {
def cata[X](some: A => X, none: => X): X
def isDefined: Boolean = cata( _ => true, false)
}
et compilé avec cette scalac -Xprint:types
. Cela a donné le résultat suivant:
[[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)
}
}
Alors les regards de celui-ci, le type inferencer est venu avec l'option 1.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow