В информатике частичное применение (или частичное применение функции ) относится к процессу фиксации ряда аргументов функции, создавая другую функцию меньшей арности . Учитывая функцию , мы могли бы исправить (или «связать») первый аргумент, создав функцию типа . Вычисление этой функции может быть представлено как . Обратите внимание, что результатом применения частичной функции в этом случае является функция, принимающая два аргумента. Частичное применение иногда неправильно называют каррированием , это родственное, но отдельное понятие.
Интуитивно понятно, что применение частичной функции говорит: «Если вы исправите первые аргументы функции, вы получите функцию остальных аргументов». Например, если функция 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 реализует необязательное частичное применение с заполнителем, например, возвращает возрастающую функцию. Scala также поддерживает каррирование нескольких списков параметров, например .def add(x: Int, y: Int) = {x+y}; add(1, _: Int)
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)
аргументы функции с аргументами. Напротив, bind
позволяет связать любой из аргументов переданной ему функции, а не только первые. Альтернативно можно использовать лямбда-выражения :
int f ( int a , int b ); auto f_partial = []( int a ) { return f ( a , 123 ); }; утверждать ( f_partial ( 456 ) == f ( 456 , 123 ) );
В Java частично MethodHandle.bindTo
применяет функцию к ее первому аргументу. [3]
В качестве альтернативы, начиная с Java 8, можно использовать лямбды:
public static < A , B , R > Function < B , R > частичное применение ( BiFunction < A , B , R > biFunc , значение A ) { return b -> biFunc . применить ( значение , б ); }
В Raku предполагаемый метод создает новую функцию с меньшим количеством параметров. [4]
Модуль стандартной библиотеки Pythonfunctools
включает partial
функцию, позволяющую привязывать позиционные и именованные аргументы, возвращая новую функцию. [5]
В XQuery заполнитель аргумента ( ?
) используется для каждого нефиксированного аргумента в приложении частичной функции. [6]
В простом лямбда-исчислении с частичным применением типов функций и продуктов ( λ →,× ) каррирование и некарингирование можно определить как
papply
curry
uncurry
Обратите внимание, что curry
papply
= curry
.
Частичное применение может быть полезным способом определить несколько полезных понятий математики.
Учитывая множества и , и функцию , можно определить функцию
где набор функций . Изображение под этой картой . Это функция, которая отправляет в . Часто встречаются структуры , которые означают, что образ ограничивается некоторым подмножеством функций , как показано в следующих примерах.
Групповое действие можно понимать как функцию . Частичная оценка ограничивается группой биекций из самой себя. Аксиомы группового действия дополнительно гарантируют гомоморфизм группы .
Внутренним произведением векторного пространства над полем является карта . Частичная оценка обеспечивает каноническое отображение в двойственное векторное пространство . Если это скалярное произведение гильбертова пространства , теорема о представлении Рисса гарантирует, что это изоморфизм .
Частичное применение векторного произведения на . Образ вектора представляет собой линейное отображение такое, что . Можно найти компоненты .
Это тесно связано с присоединенным отображением для алгебр Ли . Алгебры Ли снабжены скобкой . Частичное приложение дает карту . Аксиомы скобки гарантируют, что это отображение является гомоморфизмом алгебр Ли.