stringtranslate.com

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

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

Мотивация

Интуитивно, частичное применение функции говорит: «если вы фиксируете первые аргументы функции, вы получаете функцию оставшихся аргументов». Например, если функция 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
((( а × б ) → c ) × а ) → ( бc ) знак равно λ ( ж , Икс ). λy . е ( х , у )
curry
(( a × b ) → c ) → ( a → ( bc )) = λf . λx . λy . f ( x , y )
uncurry
( а → ( бc )) → (( а × б ) → c ) знак равно λf . λ ( Икс , у ). FXY

Обратите внимание, что curry papply= curry.

Математическая формулировка и примеры

Частичное применение может быть полезным способом определения нескольких полезных понятий в математике.

Для заданных множеств и и функции можно определить функцию

где — набор функций . Изображение под этой картой — . Это функция, которая отправляет в . Часто встречаются структуры , которые означают, что изображение ограничивается некоторым подмножеством функций , как показано в следующих примерах.

Групповые действия

Групповое действие можно понимать как функцию . Частичная оценка ограничивается группой биекций из в себя. Аксиомы группового действия далее гарантируют, что это гомоморфизм группы .

Внутренние произведения и каноническое отображение в двойственное

Внутреннее произведение на векторном пространстве над полем — это отображение . Частичная оценка обеспечивает каноническое отображение на двойственное векторное пространство , . Если это внутреннее произведение гильбертова пространства , теорема о представлении Рисса гарантирует, что это изоморфизм .

Перекрестные произведения и сопряженное отображение для алгебр Ли

Частичное применение векторного произведения на есть . Изображение вектора — это линейное отображение, такое что . Компоненты могут быть найдены как .

Это тесно связано с присоединенным отображением для алгебр Ли . Алгебры Ли снабжены скобкой . Частичное применение дает отображение . Аксиомы для скобки гарантируют, что это отображение является гомоморфизмом алгебр Ли.

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

Ссылки

  1. ^ Марлоу и Пейтон Джонс 2004
  2. ^ "clojure/clojure, частичная функция". 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 . Получено 12 сентября 2018 г.
  6. ^ "XQuery 3.1: язык запросов XML". www.w3.org . Получено 2018-09-12 .

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

Внешние ссылки