Zuerst hatte ich geglaubt, dass Unterstrichen mit Schließungen zu machen (zB println _
) für die Verwendung mit einem Pfeil nur eine Abkürzung waren (zB x => println x
), aber ich habe gerade erfahren, vor kurzem, dass Sie auch die folgenden Aktionen durchführen:Was sind in Scala die Regeln für die Herstellung von Verschlüssen mit Unterstrichen?
def f(a: Int, b: Int) = a + 2 * b
List(1, 2, 3).reduce(f _)
Gegeben Meine bisherigen Annahmen, f _
sieht aus wie eine Schließung, die genau ein Argument akzeptiert und genau ein Argument an f
übergibt. Ich nahm an, dass es mir sagen würde, dass es nicht kompilieren konnte, weil f
zwei Argumente erwartet, und reduce
sollte eine Funktion mit zwei Argumenten erwarten. Aber es funktioniert, als ob ich geschrieben hätte:
def f(a: Int, b: Int) = a + 2 * b
List(1, 2, 3).reduce((x, y) => f(x, y))
Was geht hier vor? Welche Regeln gelten für das Erstellen von Closures mit Unterstrichen?
In diesem Fall ist 'f _' ein Funktionstyp, der den Eta-Erweiterungsmechanismus verwendet. Das heißt, es übersetzt die Methode "f (a: Int, b: Int): Int" in "(Int, Int) => Int" (dh eine "Funktion2 [Int, Int, Int]"), die a ist Gültiger Typ zum Reduzieren. –
(auch als eine schnelle Notiz, Ihre Funktion ist nicht assoziativ, die den Vertrag durch reduced) –
@ math4tots auch, seien Sie sich bewusst, dass 'f _' und 'f (_)' sind zwei verschiedene Dinge. – fxlae