Подать заявление - Apply
Было предложено, чтобы эта статья была слился с Приложение функции. (Обсуждать) Предлагается с сентября 2020 года. |
В математика и Информатика, подать заявление это функция, которая применяется функция аргументов. Это центральный элемент языки программирования происходит от лямбда-исчисление, Такие как LISP и Схема, а также в функциональные языки. Он играет роль в изучении денотационная семантика компьютерных программ, потому что это непрерывная функция на полные частичные заказы. Подать заявление также является непрерывной функцией в теория гомотопии, и, действительно, лежит в основе всей теории: она позволяет рассматривать гомотопическую деформацию как непрерывный путь в пространстве функций. Точно так же допустимые мутации (рефакторинги) компьютерных программ можно рассматривать как «непрерывные» в Топология Скотта.
Наиболее общие настройки для подать заявление в теория категорий, где это правый смежный к карри в закрытые моноидальные категории. Особым случаем этого являются Декартовы закрытые категории, чей внутренний язык является просто типизированное лямбда-исчисление.
Программирование
В компьютерном программировании подать заявление применяет функцию к списку аргументов. Eval и подать заявление два взаимозависимых компонента цикл eval-apply, что является сутью оценки Lisp, описанной в SICP.[1] Применение функции соответствует бета-уменьшение в лямбда-исчисление.
Применить функцию
Apply - это также имя специальной функции на многих языках, которая принимает функцию и список и использует этот список как собственный список аргументов функции, как если бы функция вызывалась с элементами списка в качестве аргументов. Это важно для языков с вариативные функции, потому что это единственный способ вызвать функцию с неопределенным (во время компиляции) числом аргументов.
Общий Лисп и Схема
В Common Lisp подать заявление - это функция, которая применяет функцию к списку аргументов (обратите внимание, что "+" - это функция с переменным числом аргументов, которая принимает любое количество аргументов):
(подать заявление #'+ (список 1 2))
Аналогично на схеме:
(подать заявление + (список 1 2))
C ++
В C ++, Связывать [2] используется либо через пространство имен std, либо через пространство имен boost.
C # и Java
В C # и Ява, вариативные аргументы просто собираются в массив. Вызывающий может явно передать массив вместо вариативных аргументов. Это можно сделать только для вариативного параметра. Невозможно применить массив аргументов к невариадному параметру без использования отражение. Неоднозначный случай возникает, если вызывающая сторона хочет передать сам массив в качестве одного из аргументов, а не использовать массив как список аргументов. В этом случае вызывающий должен преобразовать массив в Объект
чтобы компилятор не использовал подать заявление интерпретация.
varadicFunc(arrayOfArgs);
В версии 8 были введены лямбда-выражения. Функции реализованы как объекты с функциональным интерфейсом, интерфейсом только с одним нестатическим методом. Стандартный интерфейс
Функция<Т,р>
состоят из метода (плюс некоторые статические служебные функции):
р подать заявление(Т параграф)
Идти
В Идти, типизированные вариативные аргументы просто собираются в срез. Вызывающий может явно передать фрагмент вместо вариативных аргументов, добавив ...
аргументу среза. Это можно сделать только для вариативного параметра. Вызывающий не может применить массив аргументов к параметрам без вариации без использования отражения.
s: = [] строка {"foo", "bar"} varadicFunc (s ...)
Haskell
В Haskell, функции можно применять простым сопоставлением:
func param1 param2 ...
В Haskell синтаксис также можно интерпретировать так, что каждый параметр по очереди выполняет свою функцию. В приведенном выше примере «func param1» возвращает другую функцию, принимающую на один параметр меньше, которая затем применяется к param2 и так далее, пока функция не будет иметь больше параметров.
JavaScript
В JavaScript, функциональные объекты имеют подать заявление
метод, первый аргумент - это значение это
ключевое слово внутри функции; второй - список аргументов:
func.подать заявление(ноль, аргументы);
ES6 добавляет оператор спреда func (... аргументы)
[3] который можно использовать вместо подать заявление
.
Lua
В Lua, подать заявку можно так:
функция подать заявление(ж,...) возвращаться ж(...)конец
Perl
В Perl, массивы, хэши и выражения автоматически «сглаживаются» в один список при вычислении в контексте списка, например, в списке аргументов функции.
# Эквивалентные вызовы подпрограмм:@args = (@some_args, @more_args);func(@args);func(@some_args, @more_args);
PHP
В PHP, подать заявление
называется call_user_func_array
:
call_user_func_array('func_name', $ args);
Python и Ruby
В Python и Рубин, те же обозначения звездочки, которые используются при определении вариативные функции используется для вызова функции для последовательности и массива соответственно:
func(*аргументы)
Первоначально в Python была функция применения, но это было устарел в пользу звездочки в 2.3 и удален в 3.0.[4]
р
В р, do.call
конструирует и выполняет вызов функции из имени или функции и списка аргументов, которые будут ей переданы:
ж(x1, x2)# также можно выполнить черезdo.call(Какие = ж, аргументы = список(x1, x2))
Болтовня
В Болтовня, блочные (функциональные) объекты имеют valueWithArguments:
метод, который принимает массив аргументов:
Блок valueWithArguments: аргументы
Tcl
С Tcl 8.5,[5] функция может применяться к аргументам с подать заявление
команда
подать заявление func ?арг1 арг2 ...?
где функция - это список из двух элементов {args body} или список из трех элементов {args body namespace}.
Универсальная собственность
Рассмотрим функция , то есть, где скобки обозначает пространство функций из А к B. Посредством карри, есть уникальная функция .Потом Подать заявление предоставляет универсальный морфизм
- ,
так что
или, что то же самое, схема коммутации
Точнее, карри и аппликации присоединенные функторы.
Обозначение для пространства функций из А к B чаще встречается в информатике. В теория категорий, тем не мение, известен как экспоненциальный объект, и записывается как . Есть и другие общие отличия в обозначениях; Например Подать заявление часто называют Eval,[6] хотя в информатике это не одно и то же, с оценка отличается от Подать заявление, как оценка строковой формы в кавычках функции с ее аргументами, а не применение функции к некоторым аргументам.
Кроме того, в теории категорий карри обычно обозначается как , так что написано для карри(грамм). Это обозначение противоречит использованию в лямбда-исчисление, где лямбда используется для обозначения связанных переменных. Учитывая все эти изменения в обозначениях, сопряженность Подать заявление и карри тогда выражается в диаграмме коммутации
Статьи о экспоненциальный объект и Декартова закрытая категория дать более точное обсуждение теоретико-категориальной формулировки этой идеи. Таким образом, использование лямбды здесь не случайно; то внутренний язык декартовых замкнутых категорий просто типизированное лямбда-исчисление. Наиболее общие возможные настройки для Подать заявление являются закрытые моноидальные категории, примером которых являются декартовы закрытые категории. В гомологическая алгебра, сочетание карри и аппликации известно как тензор-гом присоединение.
Топологические свойства
В теория порядка, в категории полные частичные заказы наделен Топология Скотта, обе карри и подать заявление находятся непрерывные функции (то есть они Скотт непрерывный ).[7] Это свойство помогает установить фундаментальную достоверность исследования денотационная семантика компьютерных программ.
В алгебраическая геометрия и теория гомотопии, карри и подать заявление обе непрерывные функции, когда пространство непрерывных функций из к дается компактная открытая топология, и является локально компактный Хаусдорф. Этот результат очень важен, поскольку он лежит в основе теории гомотопий, позволяя понимать гомотопические деформации как непрерывные пути в пространстве функций.
Рекомендации
- ^ Гарольд Абельсон, Джеральд Джей Сассман, Джули Сассман, Структура и интерпретация компьютерных программ, (1996) MIT Press, ISBN 0-262-01153-0. Видеть Раздел 4.1, Метациркулярный оценщик
- ^ http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#with_functions
- ^ «Синтаксис распространения - JavaScript | MDN». Получено 2017-04-20.
- ^ «Несущественные встроенные функции». Справочник по библиотеке Python. 8 февраля 2005 г.. Получено 19 мая 2013.
- ^ "подать заявление". Документация по tcl. 2006. Получено 23 июн 2014.
- ^ Saunders Mac Lane, Теория категорий
- ^ H.P. Барендрегт, Лямбда-исчисление, (1984) Северная Голландия ISBN 0-444-87508-5