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 => Booleanto 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?

War es hilfreich?

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
scroll top