In Scala können Sie Dinge tun wie:
%Vor% Der Aufruf von h
ruft foo
reference als Closure ab.
Es wäre nicht seltsam, foo
als Parameter an h
weiterzugeben:
Aber es würde nicht funktionieren:
%Vor% Was ich denke ist, dass foo
als eine Bewertung des aktuellen Parameters aufgerufen wird. Stimmt das?
Wenn eine Funktion mit einer normalen Parameterliste (nicht implizit) übergeben wurde, wird die Funktion nicht ausgewertet:
%Vor% Dies ist ein erwartetes Ergebnis und foo2
evaluation wird nicht als Bewertung eines aktuellen Parameters ausprobiert.
Warum wird foo
als tatsächlicher Parameter ausgewertet, wenn dafür keine impliziten Werte verfügbar sind?
Gleiches geschieht bei der Zuweisung:
%Vor% Es ist so, als ob Int => Unit
nicht mit einer Funktion übereinstimmt, bei der der Parameter Int
als implizit markiert ist. Der Compiler verwirft ihn als gültigen Aktualparameter und versucht daher, ihn auszuwerten. Einen deklarierten impliziten Wert zur Erfüllung des Aufrufs nicht finden.
Wenn das der Fall ist, Wie könnte man den Typ einer Funktion mit impliziten Parametern ausdrücken?
Leider können Funktionen keine impliziten Parameter haben - nur Methoden können das.
Im Ausdruck g(1)(foo)
wird foo
von einer Methode in eine Funktion konvertiert (auch bekannt als eta-Erweiterung). Und Abschnitt 6.26.2 der Scala-Spezifikation besagt Implizite Argumente werden vor eta-expansion angewendet.
Siehe dieses Ticket: implizite Methoden verhalten sich suboptimal, wenn sie nicht implizit verwendet werden
Der Typ des Parameters f
für die Funktion g
ist Function1[Int, Unit]
. Function1[A, B]
ist ein Merkmal mit der einzelnen Methode apply(a: A): B
, wobei a
nicht implizit ist. Daher können Sie keine Instanz von Function1[Int, Unit]
von foo
erstellen - sie hätte nicht die richtige Signatur.