Функция карри применяется к нескольким спискам аргументов, а не просто
один.
Вот обычная функция без карри, которая добавляет два Int
параметры, х и у:
scala> def plainOldSum(x: Int, y: Int) = x + y
plainOldSum: (x: Int,y: Int)Int
scala> plainOldSum(1, 2)
res4: Int = 3
Вот аналогичная функция, которая карри. Вместо
из одного списка из двух параметров Int, вы применяете эту функцию к двум спискам одного
Параметр Int каждый:
scala> def curriedSum(x: Int)(y: Int) = x + y
curriedSum: (x: Int)(y: Int)Intscala> second(2)
res6: Int = 3
scala> curriedSum(1)(2)
res5: Int = 3
То, что здесь происходит, заключается в том, что когда вы вызываете curriedSum
, вы фактически получаете два традиционных вызова функций друг за другом. Первая функция
вызов принимает один параметр Int с именем x
и возвращает функцию
значение для второй функции. Эта вторая функция принимает параметр Int
y
.
Вот функция с именем first
, которая по духу делает то, что первый традиционный
вызов функции curriedSum
будет делать:
scala> def first(x: Int) = (y: Int) => x + y
first: (x: Int)(Int) => Int
Применение 1 к первой функции - другими словами, вызов первой функции
и передача в 1 - дает вторую функцию:
scala> val second = first(1)
second: (Int) => Int = <function1>
Применение 2 ко второй функции дает результат:
scala> second(2)
res6: Int = 3