Jump to content

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

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

Мотивация [ править ]

Интуитивно понятно, что применение частичной функции говорит: «Если вы исправите первые аргументы функции, вы получите функцию остальных аргументов». Например, если функция 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.

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

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

Данные наборы и и функция , можно определить функцию

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

Групповые действия [ править ]

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

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

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

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

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

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

См. также [ править ]

Ссылки [ править ]

  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 г.

Дальнейшее чтение [ править ]

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 39c53c72c9beca32d8c0427a1b260536__1700394180
URL1:https://arc.ask3.ru/arc/aa/39/36/39c53c72c9beca32d8c0427a1b260536.html
Заголовок, (Title) документа по адресу, URL1:
Partial application - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)