Es gibt mindestens vier Möglichkeiten, um das Gleiche zu erreichen:
def myAddA(x: Int, y: Int) = x + y
val plusFiveA: Int => Int = myAddA(5,_)
def myAddB(x: Int)(y : Int) = x + y
val plusFiveB = myAddB(5) _
def myAddC(x: Int) = (y: Int) => x + y
val plusFiveC = myAddC(5)
def myAddD(x: Int) = {
def innerD(y: Int) = x + y
innerD _
}
val plusFiveD = myAddD(5)
Vielleicht möchten wissen, welche oder am effizientesten ist, die die beste Art ist (für einige nicht-leistungsbezogene Maßnahme von besten).
Soweit es die Effizienz geht, stellt sich heraus, dass alle vier im Wesentlichen gleichwertig sind. Die ersten beiden Fälle emittieren tatsächlich genau denselben Bytecode; Die JVM weiß nichts über mehrere Parameterlisten. Sobald der Compiler es herausgefunden hat (Sie müssen es mit einer Typannotation für Fall A unterstützen), ist es unter der Haube gleich. Der dritte Fall ist auch extrem nah, aber da er im voraus verspricht, eine Funktion zurückzugeben und sie an Ort und Stelle zu spezifizieren, kann er ein internes Feld vermeiden. Der vierte Fall ist in Bezug auf die geleistete Arbeit ziemlich genau so wie die ersten beiden; es macht nur die Umwandlung in Function1
innerhalb der Methode statt außerhalb.
In Bezug auf Stil, schlage ich vor, dass B und C die besten Möglichkeiten sind, zu gehen, je nachdem, was Sie tun. Wenn Ihr primärer Anwendungsfall darin besteht, eine Funktion zu erstellen, die nicht mit beiden Parameterlisten aufgerufen werden soll, dann verwenden Sie C, weil es Ihnen sagt, was es tun wird. (Diese Version ist zum Beispiel auch Leuten bekannt, die aus Haskell kommen.) Wenn Sie es dagegen meistens anrufen, aber nur gelegentlich curren, dann benutzen Sie B. Noch einmal, es sagt deutlicher was Das wird erwartet.
Danke, Daniel. Ihr Kommentar zu Typinferenz als Motivation für mehrere Parameterlisten ist aufschlussreich. Das war sehr hilfreich. –
Die andere Motivation ist das Schreiben von DSLs, die sich gut in die Sprache integrieren, etwas wie 'using (x) {...}'. Dies macht zwar freilich auch die Typ-Inferenz für mehrere Blöcke nutzbar. –