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++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
((( а × б ) → c ) × а ) → ( бc ) знак равно λ ( ж , Икс ). λy . е ( х , у )
curry
(( а × б ) → c ) → ( а → ( бc )) знак равно λf . λx . λy . е ( х , у )
uncurry
( а → ( бc )) → (( а × б ) → c ) знак равно λf . λ ( Икс , у ). FXY

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

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

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

Учитывая множества и , и функцию , можно определить функцию

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

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

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

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

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

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

Частичное применение векторного произведения на . Образ вектора представляет собой линейное отображение такое, что . Можно найти компоненты .

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

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

Рекомендации

  1. ^ Марлоу и Пейтон Джонс, 2004 г.
  2. ^ « Clojure / Clojure, частичная функция» . Гитхаб . Проверено 18 июля 2020 г.
  3. ^ «MethodHandle (платформа Java SE 7)» . docs.oracle.com . Проверено 12 сентября 2018 г.
  4. ^ «Метод при условии». docs.perl6.org . Проверено 12 сентября 2018 г.
  5. ^ «10.2. functools — Функции высшего порядка и операции над вызываемыми объектами — Документация Python 3.7.0» . docs.python.org . Проверено 12 сентября 2018 г.
  6. ^ «XQuery 3.1: язык запросов XML» . www.w3.org . Проверено 12 сентября 2018 г.

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

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