Zastosować - Apply

W matematyce i informatyce , zastosowanie to funkcja, która odnosi się do argumentów funkcji. Jest kluczowy dla języków programowania wywodzących się z rachunku lambda , takich jak LISP i Scheme , a także w językach funkcjonalnych . Odgrywa rolę w badaniu semantyki denotacyjnej programów komputerowych, ponieważ jest funkcją ciągłą na całkowitych porządkach cząstkowych . Apply jest również funkcją ciągłą w teorii homotopii i rzeczywiście stanowi podstawę całej teorii: umożliwia postrzeganie deformacji homotopii jako ciągłej ścieżki w przestrzeni funkcji. Podobnie prawidłowe mutacje (refaktoryzacje) programów komputerowych mogą być postrzegane jako „ciągłe” w topologii Scotta .

Najbardziej ogólnym ustawieniem do zastosowania jest teoria kategorii , gdzie jest to właściwe w połączeniu z curry w zamkniętych kategoriach monoidalnych . Szczególnym przypadkiem tego są zamknięte kategorie kartezjańskie , których językiem wewnętrznym jest po prostu typowany rachunek lambda .

Programowanie

W programowaniu komputerowym Apply stosuje funkcję do listy argumentów. Oceń i zastosuj to dwa współzależne elementy cyklu ewaluacja -zastosowanie , który jest esencją ewaluacji Lisp, opisanej w SICP . Aplikacja funkcji odpowiada redukcji beta w rachunku lambda .

Zastosuj funkcję

Apply to także nazwa funkcji specjalnej w wielu językach, która pobiera funkcję i listę oraz używa listy jako własnej listy argumentów funkcji, tak jakby funkcja została wywołana z elementami listy jako argumentami. Jest to ważne w językach z funkcjami wariadycznymi , ponieważ jest to jedyny sposób na wywołanie funkcji z nieokreśloną (w czasie kompilacji) liczbą argumentów.

Wspólne seplenienie i schemat

W Common Lisp apply to funkcja, która stosuje funkcję do listy argumentów (należy zauważyć, że "+" jest funkcją wariadyczną, która przyjmuje dowolną liczbę argumentów):

(apply #'+ (list 1 2))

Podobnie w schemacie:

(apply + (list 1 2))

C++

W C++ Bind jest używany przez przestrzeń nazw std lub przez przestrzeń nazw boost.

C# i Java

W językach C# i Java argumenty wariadyczne są po prostu gromadzone w tablicy. Wywołujący może jawnie przekazać tablicę w miejsce argumentów variadic. Można to zrobić tylko dla parametru zmiennego. Nie można zastosować tablicy argumentów do parametru niezmiennego bez użycia odbicia . Niejednoznaczny przypadek pojawia się, gdy wywołujący chce przekazać samą tablicę jako jeden z argumentów, zamiast używać tablicy jako listy argumentów. W tym przypadku dzwoniący powinien rzutować tablicę Object, aby zapobiec kompilatora z wykorzystaniem zastosować interpretację.

variadicFunc(arrayOfArgs);

W wersji 8 wprowadzono wyrażenia lambda. Funkcje są implementowane jako obiekty z interfejsem funkcjonalnym, interfejsem z tylko jedną niestatyczną metodą. Standardowy interfejs

Function<T,R>

składa się z metody (plus kilka statycznych funkcji użytkowych):

R apply(T para)

Udać się

W Go , wpisane argumenty wariadyczne są po prostu zbierane w wycinku. Wywołujący może jawnie przekazać wycinek w miejsce argumentów wariadycznych, dołączając a ...do argumentu wycinka. Można to zrobić tylko dla parametru zmiennego. Wywołujący nie może zastosować tablicy argumentów do parametrów niezmiennych bez użycia odbicia.

s := []string{"foo", "bar"}
variadicFunc(s...)

Haskell

W Haskell funkcje można zastosować przez proste zestawienie:

func param1 param2 ...

W Haskell składnia może być również interpretowana tak, że każdy parametr po kolei wykonuje swoją funkcję. W powyższym przykładzie „func param1” zwraca inną funkcję przyjmującą jeden mniej parametrów, która jest następnie stosowana do param2 i tak dalej, aż funkcja nie będzie miała więcej parametrów.

JavaScript

W JavaScript obiekty funkcji mają applymetodę, pierwszym argumentem jest wartość thissłowa kluczowego wewnątrz funkcji; druga to lista argumentów:

func.apply(null, args);

ES6 dodaje operator rozprzestrzeniania, func(...args)który może być użyty zamiast apply.

Lua

W Lua , wniosek można zapisać w ten sposób:

function apply(f,...)
  return f(...)
end

Perl

W Perlu tablice, skróty i wyrażenia są automatycznie "spłaszczane" do pojedynczej listy, gdy są oceniane w kontekście listowym, takim jak lista argumentów funkcji

# Equivalent subroutine calls:
@args = (@some_args, @more_args);
func(@args);

func(@some_args, @more_args);

PHP

W PHP , applynazywa się call_user_func_array:

call_user_func_array('func_name', $args);

Python i Ruby

W Pythonie i Ruby ta sama notacja z gwiazdką używana do definiowania funkcji wariadycznych jest używana do wywoływania funkcji odpowiednio w sekwencji i tablicy:

func(*args)

Python pierwotnie miał funkcję Apply, która została jednak przestarzała na rzecz gwiazdki w wersji 2.3 i usunięta w wersji 3.0.

r

W R , do.callkonstruuje i wykonuje wywołanie funkcji z nazwy lub funkcji oraz listę argumentów mają być przekazane do niego:

f(x1, x2)
# can also be performed via
do.call(what = f, args = list(x1, x2))

Pogawędka

W Smalltalk obiekty blokowe (funkcyjne) mają valueWithArguments:metodę, która przyjmuje tablicę argumentów:

aBlock valueWithArguments: args

Tcl

Od Tcl 8.5 funkcja może być zastosowana do argumentów za pomocą applypolecenia

apply func ?arg1 arg2 ...?

gdzie funkcja jest dwuelementową listą {args body} lub trzyelementową listą {args body namespace}.

Własność uniwersalna

Rozważmy funkcję , czyli gdzie notacja nawiasowa oznacza przestrzeń funkcji od A do B . Za pomocą curry jest unikalna funkcja . Następnie Apply zapewnia uniwersalny morfizm

,

aby

lub, równoważnie, mamy schemat dojazdów

A dokładniej curry i apply to funktory sprzężone .


Notacja przestrzeni funkcji od A do B występuje częściej w informatyce. W kategorii teoria jest jednak znana jako obiekt wykładniczy i jest zapisywana jako . Istnieją również inne wspólne różnice w zapisie; na przykład Apply jest często nazywane Eval , chociaż w informatyce nie jest to to samo, z czym eval różni się od Apply , jako ocena cytowanej postaci ciągu funkcji wraz z jej argumentami, a nie zastosowanie funkcji na pewne argumenty.

Również w teorii kategorii curry jest powszechnie oznaczane przez , co oznacza curry ( g ). Ta notacja jest w konflikcie z użyciem in lambda calculus , gdzie lambda jest używane do oznaczenia zmiennych powiązanych. Po uwzględnieniu wszystkich tych zmian w zapisie, powiązanie Apply i curry jest następnie wyrażane na diagramie dojazdów

Uniwersalna własność obiektu wykładniczego

Artykuły o przedmiocie wykładniczym i kartezjańskiej kategorii zamkniętej dostarczają dokładniejszego omówienia kategoryczno-teoretycznego sformułowania tej idei. Zatem użycie lambdy tutaj nie jest przypadkowe; język wewnętrzny kartezjańskich zamkniętych kategorii jest po prostu wpisane rachunek lambda . Najbardziej ogólnym możliwym ustawieniem dla Zastosujzamknięte kategorie monoidalne , których przykładem są zamknięte kategorie kartezjańskie. W algebrze homologicznej połączenie curry i apply jest znane jako adjunkcja tensor-hom .

Właściwości topologiczne

W teorii porządku , w kategorii zupełnych ładów cząstkowych wyposażonych w topologię Scotta , zarówno curry jak i applyfunkcjami ciągłymi (to znaczy są ciągami Scotta ). Ta właściwość pomaga ustalić fundamentalną słuszność badania semantyki denotacyjnej programów komputerowych.

W geometrii algebraicznej i teorii homotopii , curry i zastosowania są zarówno ciągłe funkcje gdy przestrzeń funkcji ciągłych z do otrzymuje zwartą otwartej topologii , i jest lokalnie zwarta Hausdorffa . Wynik ten jest bardzo ważny, ponieważ stanowi podstawę teorii homotopii, umożliwiając rozumienie deformacji homotopicznych jako ciągłych ścieżek w przestrzeni funkcji.

Bibliografia

  1. ^ Harold Abelson Gerald Jay Sussman, Julie Sussman, Struktura i interpretacja programów komputerowych , (1996), MIT Press, ISBN  0-262-01153-0 . Patrz Sekcja 4.1, Ewaluator metakołowy
  2. ^ „Boost: Dokumentacja Bind.HPP - 1.49.0” .
  3. ^ "Składnia rozprzestrzeniania - JavaScript | MDN" . Źródło 2017-04-20 .
  4. ^ „Nieistotne funkcje wbudowane” . Odniesienie do biblioteki Pythona . 8 lutego 2005 . Źródło 19 maja 2013 .
  5. ^ "zastosować" . Dokumentacja Tcl . 2006 . Pobrano 23 czerwca 2014 .
  6. ^ Saunders Mac Lane , Teoria kategorii
  7. ^ HP Barendregt, Rachunek Lambda (1984) Północna Holandia ISBN  0-444-87508-5