Частичное применение
В информатике меньшей частичное применение (или частичное применение функции ) относится к процессу фиксации ряда аргументов функции, создавая другую функцию арности . Дана функция , мы могли бы исправить (или «связать») первый аргумент, создав функцию типа . Вычисление этой функции можно представить как . Обратите внимание, что результатом применения частичной функции в этом случае является функция, принимающая два аргумента. Частичное применение иногда неправильно называют каррированием , это родственное, но отдельное понятие.
Мотивация [ править ]
Интуитивно понятно, что применение частичной функции говорит: «Если вы исправите первые аргументы функции, вы получите функцию остальных аргументов». Например, если функция div ( x , y ) = x / y , то div с параметром x, фиксированным равным 1, является другой функцией: div 1 ( y ) = div (1, y ) = 1/ y . Это то же самое, что функция inv , которая возвращает мультипликативную величину, обратную своему аргументу, определяемому inv ( y ) = 1/ y .
Практическая мотивация частичного применения заключается в том, что очень часто функции, полученные путем передачи некоторых, но не всех аргументов функции, оказываются полезными; например, во многих языках есть функция или оператор, похожие на plus_one
. Частичное применение упрощает определение этих функций, например, путем создания функции, которая представляет оператор сложения с привязанной к 1 единицей в качестве первого аргумента.
Реализации [ править ]
В таких языках, как ML , Haskell и F# , функции по умолчанию определяются в каррированной форме. Предоставление меньшего количества аргументов, чем общее количество, называется частичным применением.
В языках с первоклассными функциями можно определить curry
, uncurry
и papply
для явного выполнения каррирования и частичного применения. Это может повлечь за собой большие накладные расходы во время выполнения из-за создания дополнительных замыканий , тогда как Haskell может использовать более эффективные методы. [1]
Scala реализует необязательное частичное приложение с заполнителем, например def add(x: Int, y: Int) = {x+y}; add(1, _: Int)
возвращает возрастающую функцию. Scala также поддерживает каррирование нескольких списков параметров, например def add(x: Int)(y: Int) = {x+y}; add(1) _
.
Clojure реализует частичное приложение, используя partial
функция, определенная в ее основной библиотеке. [2]
Стандартная библиотека C++ предоставляет bind(function, args..)
вернуть объект функции , который является результатом частичного применения данных аргументов к данной функции. Начиная с C++20, функция bind_front(function, args...)
также предоставляется, который связывает первый sizeof...(args)
аргументы функции в args. В отличие, bind
позволяет связать любой из аргументов переданной ему функции, а не только первые. Альтернативно лямбда-выражения можно использовать :
int f(int a, int b);
auto f_partial = [](int a) { return f(a, 123); };
assert(f_partial(456) == f(456, 123) );
На Яве , MethodHandle.bindTo
частично применяет функцию к ее первому аргументу. [3]
Альтернативно, начиная с Java 8, можно использовать лямбды:
public static <A, B, R> Function<B, R> partialApply(BiFunction<A, B, R> biFunc, A value) {
return b -> biFunc.apply(value, b);
}
В Раку assuming
метод создает новую функцию с меньшим количеством параметров. [4]
Модуль Python стандартной библиотеки functools
включает в себя partial
функция, позволяющая привязывать позиционные и именованные аргументы, возвращая новую функцию. [5]
В XQuery заполнитель аргумента ( ?
) используется для каждого нефиксированного аргумента в приложении частичной функции. [6]
Определения [ править ]
В простом лямбда-исчислении с типами функций и продуктов ( λ →,× ) частичное применение, каррирование и некаррирование можно определить как
papply
- ((( а × б ) → c ) × а ) → ( б → c ) знак равно λ ( ж , Икс ). ли . е ( х , у )
curry
- (( а × б ) → c ) → ( а → ( б → c )) знак равно λf . λx . λy . е ( х , у )
uncurry
- ( а → ( б → c )) → (( а × б ) → c ) знак равно λf . λ ( Икс , у ). FXY
Обратите внимание, что curry
papply
= curry
.
и примеры формулировка Математическая
Частичное применение может быть полезным способом определить несколько полезных понятий математики.
Данные наборы и и функция , можно определить функцию
где это набор функций . Образ под этой картой находится . Это функция, которая отправляет к . Часто встречаются конструкции это означает, что образ ограничивается некоторым подмножеством функций , как показано в следующих примерах.
Групповые действия [ править ]
Групповое действие можно понимать как функцию . Частичная оценка ограничивается группой биекций из самому себе. Аксиомы группового действия дополнительно гарантируют является групповым гомоморфизмом .
Внутренние произведения и каноническое отображение на двойственное [ править ]
Внутренний продукт в векторном пространстве над полем это карта . Частичная оценка обеспечивает каноническую карту в двойственное векторное пространство . . Если это скалярное произведение гильбертова пространства , теорема о представлении Рисса гарантирует, что это изоморфизм .
Перекрестные произведения и присоединенное отображение алгебр Ли
Частичное применение векторного произведения на является . Изображение вектора это линейная карта такой, что . Компоненты можно найти .
Это тесно связано с присоединенным отображением для алгебр Ли . Алгебры Ли снабжены скобкой . Частичное приложение дает карту . Аксиомы скобки гарантируют, что это отображение является гомоморфизмом алгебр Ли.
См. также [ править ]
- n-преобразование
- ПОП-2
- Ограничение (математика) — более общее явление ограничения функции подмножеством ее области определения.
Ссылки [ править ]
- ^ Марлоу и Пейтон Джонс, 2004 г.
- ^ «clojure/clojure, частичная функция» . Гитхаб . Проверено 18 июля 2020 г.
- ^ «MethodHandle (платформа Java SE 7)» . docs.oracle.com . Проверено 12 сентября 2018 г.
- ^ «Метод предположения» . docs.perl6.org . Проверено 12 сентября 2018 г.
- ^ «10.2. functools — Функции высшего порядка и операции над вызываемыми объектами — Документация Python 3.7.0» . docs.python.org . Проверено 12 сентября 2018 г.
- ^ «XQuery 3.1: язык запросов XML» . www.w3.org . Проверено 12 сентября 2018 г.
Дальнейшее чтение [ править ]
- Марлоу, Саймон ; Пейтон Джонс, Саймон (2004), «Создание быстрого карри: Push/Enter против Eval/Apply для языков высшего порядка» , ICFP '04 Материалы девятой международной конференции ACM SIGPLAN по функциональному программированию
- Бенджамин С. Пирс и др. «Частичное применение» , Архивировано 21 мая 2016 г. на Wayback Machine «Отступление: Каррирование» . Архивировано 21 мая 2016 г. в Wayback Machine Software Foundations .
Внешние ссылки [ править ]
- Применение частичной функции на коде Rosetta.
- Частичное приложение в Haskell Wiki
- Постоянная аппликативная форма в Haskell Wiki
- Опасности быть слишком пристрастными