Существует как минимум четыре способа сделать то же самое:
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)
Возможно, вы захотите узнать , который наиболее эффективен или , который является лучшим стилем (для некоторой лучшей оценки, основанной на неэффективности).
Что касается эффективности, то оказывается, что все четыре по существу эквивалентны.Первые два случая фактически излучают один и тот же байт-код;JVM ничего не знает о множественных списках параметров, поэтому, как только компилятор выяснит это (вам нужно помочь с аннотацией типа в случае A), все будет скрыто.Третий случай также очень близок, но так как он обещает заблаговременно вернуть функцию и указывает ее на месте, он может избежать одного внутреннего поля.Четвертый случай почти такой же, как первые два с точки зрения проделанной работы;он просто выполняет преобразование в Function1
внутри метода, а не снаружи.
С точки зрения стиля, я предлагаю, чтобы B и C были лучшими способами, в зависимости от того, что вы делаете.Если ваш основной вариант использования заключается в создании функции, а не в вызове на месте с обоими списками параметров, тогда используйте C, потому что он говорит вам, что он собирается делать.(Эта версия также особенно знакома, например, людям, приезжающим из Хаскелла.) С другой стороны, если вы в основном собираетесь вызывать его на месте, но только изредка его карри, то используйте B. Опять же, он более четко говорит, чтоэто ожидается.