Применять

В математике и информатике применяет apply — это функция, которая функцию к аргументам. Он занимает центральное место в языках программирования, производных от лямбда-исчисления , таких как LISP и Scheme , а также в функциональных языках . Она играет важную роль в изучении денотационной семантики компьютерных программ, поскольку представляет собой непрерывную функцию на полных частичных порядках . Apply также является непрерывной функцией в теории гомотопий и фактически лежит в основе всей теории: она позволяет рассматривать гомотопическую деформацию как непрерывный путь в пространстве функций. Аналогично, допустимые мутации (рефакторинги) компьютерных программ можно рассматривать как «непрерывные» в топологии Скотта .
Наиболее общая установка для применения находится в теории категорий , где она правильно сопряжена с каррированием в закрытых моноидальных категориях . Особым случаем являются декартовы закрытые категории , внутренний язык которых представляет собой просто типизированное лямбда-исчисление .
Программирование [ править ]
В компьютерном программировании Apply применяет функцию к списку аргументов. Eval и apply — два взаимозависимых компонента цикла eval-apply , который составляет суть оценки Lisp, описанной в SICP . [1] Применение функции соответствует бета-редукции в лямбда-исчислении .
Применить функцию [ править ]
Apply во многих языках также является названием специальной функции, которая принимает функцию и список и использует этот список в качестве собственного списка аргументов функции, как если бы функция вызывалась с элементами списка в качестве аргументов. Это важно в языках с вариативными функциями , поскольку это единственный способ вызвать функцию с неопределенным (во время компиляции) количеством аргументов.
Common Lisp и Scheme [ править ]
В Common Lisp apply — это функция, которая применяет функцию к списку аргументов (обратите внимание, что «+» — это вариативная функция, принимающая любое количество аргументов):
(apply #'+ (list 1 2))
Аналогично на схеме:
(apply + (list 1 2))
С++ [ править ]
В C++ привязка [2] используется либо через пространство имен std, либо через пространство имен boost.
C# и Java [ править ]
В C# и Java переменные аргументы просто собираются в массив. Вызывающая сторона может явно передать массив вместо переменных аргументов. Это можно сделать только для вариативного параметра. Невозможно применить массив аргументов к невариативному параметру без использования отражения . Неоднозначный случай возникает, если вызывающая сторона хочет передать сам массив в качестве одного из аргументов, а не использовать массив в качестве списка аргументов. В этом случае вызывающая сторона должна привести массив к Object
чтобы компилятор не мог использовать интерпретацию apply .
variadicFunc(arrayOfArgs);
В версии 8 были представлены лямбда-выражения. Функции реализованы как объекты с функциональным интерфейсом, интерфейсом только с одним нестатическим методом. Стандартный интерфейс
Function<T,R>
состоят из метода (плюс некоторые статические служебные функции):
R apply(T para)
Иди [ править ]
В Go типизированные переменные аргументы просто собираются в срез. Вызывающий может явно передать срез вместо переменных аргументов, добавив ...
к аргументу среза. Это можно сделать только для вариативного параметра. Вызывающий не может применить массив аргументов к невариативным параметрам без использования отражения.
s := []string{"foo", "bar"}
variadicFunc(s...)
Хаскелл [ править ]
В Haskell функции можно применять простым сопоставлением:
func param1 param2 ...
В Haskell синтаксис также можно интерпретировать так, что каждый параметр по очереди выполняет свою функцию. В приведенном выше примере «func param1» возвращает другую функцию, принимающую на один параметр меньше, которая затем применяется к param2 и так далее, пока у функции не останется параметров.
JavaScript [ править ]
В JavaScript функциональные объекты имеют apply
метод, первый аргумент — это значение this
ключевое слово внутри функции; второй — список аргументов:
func.apply(null, args);
ES6 добавляет оператор расширения func(...args)
[3] который можно использовать вместо apply
.
Луа [ править ]
В Lua apply можно записать так:
function apply(f,...)
return f(...)
end
Перл [ править ]
В Perl массивы, хеши и выражения автоматически «сглаживаются» в один список при оценке в контексте списка, например, в списке аргументов функции.
# Equivalent subroutine calls:
@args = (@some_args, @more_args);
func(@args);
func(@some_args, @more_args);
PHP [ править ]
В PHP , apply
называется call_user_func_array
:
call_user_func_array('func_name', $args);
Питон и Руби [ править ]
В Python и Ruby та же нотация звездочки, которая используется при определении переменных функций , используется для вызова функции в последовательности и массиве соответственно:
func(*args)
Изначально в Python была функция Apply, но в версии 2.3 она была устаревшей в пользу звездочки и удалена в версии 3.0. [4]
Р [ править ]
В Р , do.call
конструирует и выполняет вызов функции из имени или функции и списка аргументов, которые должны быть ей переданы:
f(x1, x2)
# can also be performed via
do.call(what = f, args = list(x1, x2))
Смолток [ править ]
В Smalltalk объекты блоков (функций) имеют valueWithArguments:
метод, который принимает массив аргументов:
aBlock valueWithArguments: args
ТКЛ [ править ]
Начиная с Tcl 8.5, [5] функция может быть применена к аргументам с помощью apply
команда
apply func ?arg1 arg2 ...?
где функция представляет собой список из двух элементов {тело args} или список из трёх элементов {пространство имен тела args}.
Универсальная собственность [ править ]
Рассмотрим функцию , то есть, где обозначение в скобках обозначает пространство функций от A до B . С помощью каррирования существует уникальная функция . Тогда Apply предоставляет универсальный морфизм
- ,
так что
или, что то же самое, имеется коммутационная диаграмма
Точнее, curry и apply — сопряженные функторы .
Обозначения поскольку пространство функций от A до B чаще встречается в информатике. в теории категорий Однако известен как экспоненциальный объект и записывается как . Есть и другие общие различия в обозначениях; например, Apply часто называют Eval , [6] хотя в информатике это не одно и то же: eval отличается от Apply , поскольку представляет собой оценку строковой формы функции с ее аргументами в кавычках, а не применение функции к некоторым аргументам.
Кроме того, в теории категорий карри обычно обозначается как , так что написано для карри ( g ). Это обозначение противоречит использованию в лямбда-исчислении , где лямбда используется для обозначения связанных переменных. С учетом всех этих изменений в обозначениях сопряженность Apply и curry выражается в коммутирующей диаграмме.

Статьи об экспоненциальном объекте и декартовой замкнутой категории дают более точное обсуждение теоретико-категорной формулировки этой идеи. Таким образом, использование лямбды здесь не случайно; Внутренний язык декартовых замкнутых категорий — это просто типизированное лямбда-исчисление . Наиболее общими настройками Apply являются закрытые моноидальные категории , примером которых являются декартовы закрытые категории. В гомологической алгебре сопряженность curry и apply известна как присоединение тензорного хома .
Топологические свойства [ править ]
В теории порядка , в категории полных частичных порядков, наделенных топологией Скотта , и curry , и apply являются непрерывными функциями (то есть они непрерывны по Скотту ). [7] Это свойство помогает установить фундаментальную обоснованность изучения денотационной семантики компьютерных программ.
В алгебраической геометрии и теории гомотопий curry и apply являются непрерывными функциями, когда пространство непрерывных функций из к задана компактная открытая топология и Хаусдорфу локально компактен по . Этот результат очень важен, поскольку он лежит в основе теории гомотопий, позволяя понимать гомотопические деформации как непрерывные пути в пространстве функций.
Ссылки [ править ]
- ^ Гарольд Абельсон, Джеральд Джей Сассман, Джули Сассман, Структура и интерпретация компьютерных программ , (1996) MIT Press, ISBN 0-262-01153-0 . См. Раздел 4.1, Метациркулярный оценщик.
- ^ «Boost: документация Bind.HPP — 1.49.0» .
- ^ «Синтаксис распространения — JavaScript | MDN» . Проверено 20 апреля 2017 г.
- ^ «Необязательные встроенные функции» . Справочник по библиотеке Python . 8 февраля 2005 г. Проверено 19 мая 2013 г.
- ^ "применять" . TCL-документация . 2006 год . Проверено 23 июня 2014 г.
- ^ Сондерс Мак Лейн , Теория категорий
- ^ HP Barendregt, Лямбда-исчисление , (1984) Северная Голландия ISBN 0-444-87508-5