Jump to content

Применять

В математике и информатике применяет 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 выражается в коммутирующей диаграмме.

Универсальное свойство экспоненциального объекта
Universal property of the exponential object

Статьи об экспоненциальном объекте и декартовой замкнутой категории дают более точное обсуждение теоретико-категорной формулировки этой идеи. Таким образом, использование лямбды здесь не случайно; Внутренний язык декартовых замкнутых категорий — это просто типизированное лямбда-исчисление . Наиболее общими настройками Apply являются закрытые моноидальные категории , примером которых являются декартовы закрытые категории. В гомологической алгебре сопряженность curry и apply известна как присоединение тензорного хома .

Топологические свойства [ править ]

В теории порядка , в категории полных частичных порядков, наделенных топологией Скотта , и curry , и apply являются непрерывными функциями (то есть они непрерывны по Скотту ). [7] Это свойство помогает установить фундаментальную обоснованность изучения денотационной семантики компьютерных программ.

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

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

  1. ^ Гарольд Абельсон, Джеральд Джей Сассман, Джули Сассман, Структура и интерпретация компьютерных программ , (1996) MIT Press, ISBN   0-262-01153-0 . См. Раздел 4.1, Метациркулярный оценщик.
  2. ^ «Boost: документация Bind.HPP — 1.49.0» .
  3. ^ «Синтаксис распространения — JavaScript | MDN» . Проверено 20 апреля 2017 г.
  4. ^ «Необязательные встроенные функции» . Справочник по библиотеке Python . 8 февраля 2005 г. Проверено 19 мая 2013 г.
  5. ^ "применять" . TCL-документация . 2006 год . Проверено 23 июня 2014 г.
  6. ^ Сондерс Мак Лейн , Теория категорий
  7. ^ HP Barendregt, Лямбда-исчисление , (1984) Северная Голландия ISBN   0-444-87508-5
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7e7457f57a3f6f76583dd4e6f052bdd7__1687903200
URL1:https://arc.ask3.ru/arc/aa/7e/d7/7e7457f57a3f6f76583dd4e6f052bdd7.html
Заголовок, (Title) документа по адресу, URL1:
Apply - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)