Scala digitare domanda inferenza
-
04-10-2019 - |
Domanda
Stavo pottering circa con Tony Morris' ottimo esercizio sulla catamorphisms , quando stavo riflettendo quello che stava accadendo nella seguente situazione ...
def cata[X](some: A => X, none: => X): X
Vorrei ora chiamo questo metodo come segue:
def isDefined: Boolean = cata( _ => true, false)
Mi chiedevo se il tipo inferencer determina il tipo di _ => true
to essere A => Boolean
o Any => Boolean
. A causa del fatto che Function1
è contra-variante nel suo parametro di ingresso, entrambi seguente compilazione bene:
def isDefined: Boolean = cata( (_: A) => true, false) //#1
def isDefined: Boolean = cata( (_: Any) => true, false) //#2
Quindi la domanda è, fa il tipo inferencer venire con 1 o 2 # #?
Soluzione
ho provato questo fuori:
trait MyOption[+A] {
def cata[X](some: A => X, none: => X): X
def isDefined: Boolean = cata( _ => true, false)
}
e compilato questo con scalac -Xprint:types
. Questo ha dato il seguente risultato:
[[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)
}
}
Quindi, gli sguardi di esso, il tipo inferencer si avvicinò con l'opzione # 1.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow