Карринг и частичное применение — это два способа преобразования функции в другую функцию с меньшей арностью. Хотя их часто путают друг с другом, они делают разные вещи. Этот пост объясняет детали.
Карринг
Карри принимает функцию
f: X × Y → R
и превращает его в функцию
f ‘: X → (Y → R)
Вместо вызова f с двумя аргументами мы вызываем f ‘с первым аргументом. Результатом является функция, которую мы затем вызываем со вторым аргументом для получения результата. Таким образом, если uncurried f вызывается как
f (3, 5)
тогда карри F ‘вызывается как
F ‘(3) (5)
Пример JavaScript Ниже приведена неиспользуемая двоичная функция add ()
function add(x, y) { return × + y; }
Называя это:
> add(3, 5) 8
Карри версия дополнения выглядит следующим образом.
function addC(x) { return function (y) { return x + y; } }
Называя это:
> addC(3)(5) 8
Алгоритм для карри. Функция карри карри заданной двоичной функции. Имеет подпись
карри: (X × Y → R) → (X → (Y → R))
Объяснение: curry принимает двоичную функцию и возвращает унарную функцию, которая возвращает унарную функцию. Его код JavaScript
function curry(f) { return function(x) { return function(y) { return f(x, y); } } }
Частичное применение
Частичное приложение принимает функцию
f: X × Y → R
и фиксированное значение x для первого аргумента для создания новой функции
f ‘: Y → R
f ‘делает то же самое, что и f, но должен заполнить только второй параметр, поэтому его арность на единицу меньше арности f. Один говорит, что первый аргумент
связан с х.
Пример JavaScript Привязка первого аргумента функции add к 5 создает функцию plus5. Сравните их определения, чтобы увидеть, что мы просто заполнили первый аргумент.
function plus5(y) { return 5 + y; }
Алгоритм частичного применения. Функция partApply частично применяет двоичные функции. Имеет подпись
partApply: ((X × Y → R) × X) → (Y → R)
Объяснение: partApply принимает двоичную функцию и значение и создает унарную функцию. Его код JavaScript
function partApply(f, x) { return function(y) { return f(x, y); } }
Общее частичное применение в JavaScript. В JavaScript есть встроенный метод Function.prototype.bind, который работает с функциями любого уровня и может связывать произвольное количество параметров. Его вызов имеет следующий синтаксис.
func.bind(thisValue, [arg1], [arg2], ...)
Он превращает func в новую функцию, для которой неявным параметром this является thisValue и чьи начальные аргументы всегда соответствуют заданным Когда кто-то вызывает новую функцию, аргументы такого вызова добавляются к тому, что уже было предоставлено через bind. У MDN есть
больше деталей .
> var plus5 = add.bind(null, 5) > plus5(10) 15
Обратите внимание, что thisValue не имеет значения для функции добавления (не для метода), поэтому оно выше нуля.
Карри против частичного применения
Разница между ними заключается в следующем:
- Каррирование всегда дает вложенные унарные (1-арные) функции. Преобразованная функция все еще в значительной степени совпадает с оригинальной
- Частичное применение производит функции произвольной арности. Преобразованная функция отличается от оригинала — ей нужно меньше аргументов.
Интересно, что с помощью функции карри и вызова карри легко достичь того же эффекта, что и при привязке одного аргумента (выполнение этой операции несколько раз приводит к общему случаю): чтобы связать первый аргумент со значением, вы просто применяете самый внешний вложенных функций к этому значению, которое возвращает желаемую новую функцию.
Связанное чтение
- Частичное приложение в Википедии [частичный источник этого поста ]