Scala Inferenz Frage eingeben
-
04-10-2019 - |
Frage
Ich war Pöttering fast mit Tony Morris' ausgezeichneter Übung auf catamorphisms , wenn ich grüble, was in der folgenden Situation geschieht ...
def cata[X](some: A => X, none: => X): X
Lassen Sie mich nun diese Methode aufrufen, wie folgt:
def isDefined: Boolean = cata( _ => true, false)
Ich habe mich gefragt, ob der Typ Rückschließer die Art der bestimmt _ => true
oder A => Boolean
Any => Boolean
to sein. Aufgrund der Tatsache, dass Function1
ist kontravarianten in seinem Eingangsparameter, die beide der folgenden Kompilierung ganz gut:
def isDefined: Boolean = cata( (_: A) => true, false) //#1
def isDefined: Boolean = cata( (_: Any) => true, false) //#2
Die Frage ist also, hat die Art Rückschließer kommt mit # 1 oder # 2?
Lösung
habe ich versucht, diese aus:
trait MyOption[+A] {
def cata[X](some: A => X, none: => X): X
def isDefined: Boolean = cata( _ => true, false)
}
und kompiliert diese mit scalac -Xprint:types
. Dies ergab die folgende Ausgabe:
[[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)
}
}
So von den Blicken von ihm, kam der Typ mit der Option Rückschließer up # 1.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow