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ą apply
metodę, pierwszym argumentem jest wartość this
sł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 , apply
nazywa 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.call
konstruuje 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ą apply
polecenia
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
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 Zastosuj są zamknię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 apply są funkcjami 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
- ^ 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
- ^ „Boost: Dokumentacja Bind.HPP - 1.49.0” .
- ^ "Składnia rozprzestrzeniania - JavaScript | MDN" . Źródło 2017-04-20 .
- ^ „Nieistotne funkcje wbudowane” . Odniesienie do biblioteki Pythona . 8 lutego 2005 . Źródło 19 maja 2013 .
- ^ "zastosować" . Dokumentacja Tcl . 2006 . Pobrano 23 czerwca 2014 .
- ^ Saunders Mac Lane , Teoria kategorii
- ^ HP Barendregt, Rachunek Lambda (1984) Północna Holandia ISBN 0-444-87508-5