Частичное применение - 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
Обратите внимание, что карри
паприка
= карри
.
Смотрите также
Рекомендации
- ^ Марлоу и Пейтон Джонс 2004
- ^ "закрытие / закрытие, частичная функция". GitHub. Получено 2020-07-18.
- ^ "MethodHandle (Java Platform SE 7)". docs.oracle.com. Получено 2018-09-12.
- ^ «Метод, предполагающий». docs.perl6.org. Получено 2018-09-12.
- ^ «10.2. Functools - Функции высшего порядка и операции над вызываемыми объектами - Документация Python 3.7.0». docs.python.org. Получено 2018-09-12.
- ^ «XQuery 3.1: язык запросов XML». www.w3.org. Получено 2018-09-12.
дальнейшее чтение
- Саймон Марлоу и Саймон Пейтон Джонс (2004, 2006). «Создание быстрого карри: нажмите / введите или оцените / подайте заявку на получение языков высокого уровня». ICFP '04 Материалы девятой международной конференции ACM SIGPLAN по функциональному программированию.
- Бенджамин С. Пирс и другие. «Частичное приложение», «Отступление: каррирование». Основы программного обеспечения.
внешняя ссылка
- Частичное приложение функции по коду Розетты.
- Частичное применение в Haskell Wiki
- Постоянная заявочная форма в Haskell Wiki
- Опасности быть слишком пристрастными