В информатике частичное применение (или частичное применение функции ) относится к процессу фиксации ряда аргументов функции, производя другую функцию меньшей арности . Учитывая функцию , мы можем зафиксировать (или «связать») первый аргумент, производя функцию типа . Оценка этой функции может быть представлена как . Обратите внимание, что результатом частичного применения функции в этом случае является функция, которая принимает два аргумента. Частичное применение иногда неправильно называют каррированием , что является связанным, но отдельным понятием.
Интуитивно, частичное применение функции говорит: «если вы фиксируете первые аргументы функции, вы получаете функцию оставшихся аргументов». Например, если функция 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++20bind_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 ) );
В JavaMethodHandle.bindTo
частично применяет функцию к ее первому аргументу. [3] В качестве альтернативы, начиная с Java 8 ,
можно использовать лямбды:
public static < A , B , R > Функция < B , R > partialApply ( BiFunction < A , B , R > biFunc , A значение ) { return b -> biFunc . apply ( значение , b ); }
В Raku метод предположения создает новую функцию с меньшим количеством параметров. [4]
Модуль стандартной библиотеки Pythonfunctools
включает partial
функцию, позволяющую привязывать позиционные и именованные аргументы, возвращая новую функцию. [5]
В XQuery?
для каждого нефиксированного аргумента в частичном функциональном приложении используется заполнитель аргумента ( ). [6]
В простом типизированном лямбда-исчислении с частичным применением типов функций и произведений ( λ →,× ) каррирование и декаррирование можно определить как
papply
curry
uncurry
Обратите внимание, что curry
papply
= curry
.
Частичное применение может быть полезным способом определения нескольких полезных понятий в математике.
Для заданных множеств и и функции можно определить функцию
где — набор функций . Изображение под этой картой — . Это функция, которая отправляет в . Часто встречаются структуры , которые означают, что изображение ограничивается некоторым подмножеством функций , как показано в следующих примерах.
Групповое действие можно понимать как функцию . Частичная оценка ограничивается группой биекций из в себя. Аксиомы группового действия далее гарантируют, что это гомоморфизм группы .
Внутреннее произведение на векторном пространстве над полем — это отображение . Частичная оценка обеспечивает каноническое отображение на двойственное векторное пространство , . Если это внутреннее произведение гильбертова пространства , теорема о представлении Рисса гарантирует, что это изоморфизм .
Частичное применение векторного произведения на есть . Изображение вектора — это линейное отображение, такое что . Компоненты могут быть найдены как .
Это тесно связано с присоединенным отображением для алгебр Ли . Алгебры Ли снабжены скобкой . Частичное применение дает отображение . Аксиомы для скобки гарантируют, что это отображение является гомоморфизмом алгебр Ли.