Частичное применение - Partial application

В Информатика, частичное применение (или же приложение с частичной функцией) относится к процессу фиксации ряда аргументов функции, создавая другую функцию меньшего размера. арность. Учитывая функцию , мы можем исправить (или "связать") первый аргумент, создав функцию типа . Оценка этой функции может быть представлена ​​как . Обратите внимание, что результатом частичного применения функции в этом случае является функция, которая принимает два аргумента. Частичное приложение иногда неправильно называется карри, который является родственным, но отдельным понятием.

Мотивация

Интуитивно понятно, что приложение с частичной функцией говорит: "Если вы исправите первый аргументы функции, вы получите функцию оставшихся аргументов ". Например, если функция div (х, у) = Икс/у, тогда div с параметром Икс с фиксированным значением 1 - это еще одна функция: div1(y) = div (1, y) = 1 / y. Это то же самое, что и функция inv который возвращает мультипликативное обратное значение своего аргумента, определяемого inv(у) = 1/у.

Практическая мотивация частичного применения состоит в том, что очень часто функции, полученные путем предоставления некоторых, но не всех аргументов функции, полезны; например, во многих языках есть функция или оператор, аналогичный плюс один. Частичное применение упрощает определение этих функций, например, путем создания функции, которая представляет оператор сложения с привязкой 1 в качестве первого аргумента.

Реализации

На таких языках, как ML, Haskell и F #, функции определены в карри форма по умолчанию. Подача аргументов меньшего, чем общее количество, называется частичным применением.

На языках с первоклассные функции можно определить карри, не спешить и паприка для явного выполнения каррирования и частичного применения. Это может привести к увеличению накладных расходов во время выполнения из-за создания дополнительных закрытие, в то время как Haskell может использовать более эффективные методы.[1]

Scala реализует необязательное частичное приложение с заполнителем, например def Добавить(Икс: Int, у: Int) = {Икс+у}; Добавить(1, _: Int) возвращает увеличивающуюся функцию. Scala также поддерживает несколько списков параметров в качестве каррирования, например def Добавить(Икс: Int)(у: Int) = {Икс+у}; Добавить(1) _.

Clojure реализует частичное приложение, используя частичный функция, определенная в его основной библиотеке.[2]

В C ++ стандартная библиотека предоставляет привязать (функция, аргументы ..) вернуть функциональный объект это результат частичного применения данных аргументов к данной функции. В качестве альтернативы, лямбда-выражения может быть использован:

int ж(int а, int б);авто f_partial = [](int а) { возвращаться ж(а, 123); };утверждать(f_partial(456) == ж(456, 123) );

В Ява, MethodHandle.bindTo частично применяет функцию к своему первому аргументу.[3]В качестве альтернативы, начиная с Java 8, можно использовать лямбды:

общественный статический <А, B, р> Функция<B, р> частичное(BiFunction<А, B, р> biFunc, А ценить) {    возвращаться б -> biFunc.подать заявление(ценить, б);}

В Раку, то предполагая создает новую функцию с меньшим количеством параметров.[4]

В Python стандартный библиотечный модуль functools включает частичный функция, позволяющая привязать позиционные и именованные аргументы, возвращая новую функцию.[5]

В XQuery, заполнитель аргумента (?) используется для каждого нефиксированного аргумента в приложении частичной функции.[6]

Определения

в просто типизированное лямбда-исчисление с функция и виды продукции (λ→,×) частичное применение, каррирование и отключение может быть определено как:

паприка
(((а × б) → c) × а) → (бc) = λ(ж, Икс). λy. ж (Икс, у)
карри
((а × б) → c) → (а → (бc)) = λf. λx. λy. ж (Икс, у)
не спешить
(а → (бc)) → ((а × б) → c) = λf. λ(Икс, у). f x y

Обратите внимание, что карри паприка = карри.

Смотрите также

Рекомендации

  1. ^ Марлоу и Пейтон Джонс 2004
  2. ^ "закрытие / закрытие, частичная функция". GitHub. Получено 2020-07-18.
  3. ^ "MethodHandle (Java Platform SE 7)". docs.oracle.com. Получено 2018-09-12.
  4. ^ «Метод, предполагающий». docs.perl6.org. Получено 2018-09-12.
  5. ^ «10.2. Functools - Функции высшего порядка и операции над вызываемыми объектами - Документация Python 3.7.0». docs.python.org. Получено 2018-09-12.
  6. ^ «XQuery 3.1: язык запросов XML». www.w3.org. Получено 2018-09-12.

дальнейшее чтение

внешняя ссылка