Implizite Parameter funktionieren nicht mehr, nachdem sie an eine Funktion höherer Ordnung übergeben wurden

8

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:

%Vor%

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?

    
Pablo Francisco Pérez Hidalgo 22.09.2015, 12:20
quelle

2 Antworten

11

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

    
dcastro 22.09.2015, 12:42
quelle
1

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.

    
Shadowlands 22.09.2015 12:56
quelle

Tags und Links