Подать заявление - Apply

В математика и Информатика, подать заявление это функция, которая применяется функция аргументов. Это центральный элемент языки программирования происходит от лямбда-исчисление, Такие как 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] Это свойство помогает установить фундаментальную достоверность исследования денотационная семантика компьютерных программ.

В алгебраическая геометрия и теория гомотопии, карри и подать заявление обе непрерывные функции, когда пространство непрерывных функций из к дается компактная открытая топология, и является локально компактный Хаусдорф. Этот результат очень важен, поскольку он лежит в основе теории гомотопий, позволяя понимать гомотопические деформации как непрерывные пути в пространстве функций.

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

  1. ^ Гарольд Абельсон, Джеральд Джей Сассман, Джули Сассман, Структура и интерпретация компьютерных программ, (1996) MIT Press, ISBN  0-262-01153-0. Видеть Раздел 4.1, Метациркулярный оценщик
  2. ^ http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#with_functions
  3. ^ «Синтаксис распространения - JavaScript | MDN». Получено 2017-04-20.
  4. ^ «Несущественные встроенные функции». Справочник по библиотеке Python. 8 февраля 2005 г.. Получено 19 мая 2013.
  5. ^ "подать заявление". Документация по tcl. 2006. Получено 23 июн 2014.
  6. ^ Saunders Mac Lane, Теория категорий
  7. ^ H.P. Барендрегт, Лямбда-исчисление, (1984) Северная Голландия ISBN  0-444-87508-5