Статьи

Карри против частичного применения (с кодом JavaScript)


Карринг и частичное применение — это два способа преобразования функции в другую функцию с меньшей арностью.
Хотя их часто путают друг с другом, они делают разные вещи. Этот пост объясняет детали.

Карринг

Карри принимает функцию


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-арные) функции. Преобразованная функция все еще в значительной степени совпадает с оригинальной
  • Частичное применение производит функции произвольной арности. Преобразованная функция отличается от оригинала — ей нужно меньше аргументов.

Интересно, что с помощью функции карри и вызова карри легко достичь того же эффекта, что и при привязке одного аргумента (выполнение этой операции несколько раз приводит к общему случаю): чтобы связать первый аргумент со значением, вы просто применяете самый внешний вложенных функций к этому значению, которое возвращает желаемую новую функцию.

Связанное чтение

  1. Частичное приложение в Википедии [частичный источник этого поста ]

С http://www.2ality.com/2011/09/curring-vs-part-eval.html