Jestem trochę zdezorientowany co do „funkcji” i „lambda”. Widziałem kilka przykładów pokazujących, że słowo kluczowe schematu lambda
działa bardzo podobnie do słowa kluczowego JavaScript function
, ale tak naprawdę nie wiem, jak są ze sobą powiązane.
Powiedziano mi, że „funkcji” i „metody” można używać zamiennie, mówiąc o obiektach w .net. Zastanawiam się, czy „lambda” i „funkcja” podobnie oznaczają to samo. Zastanawiam się, czy „lambda” ma jakieś ezoteryczne znaczenie, biorąc pod uwagę, że grecka litera lambda (λ) pojawia się w tylu awatarach na tej stronie. Aby jeszcze bardziej skomplikować sprawę, w .net funkcjonalne części języka C # odnoszą się do wyrażeń funkcyjnych przekazywanych do innej funkcji jako „wyrażeń lambda”, więc to słowo wydaje się być wszędzie.
Nieokreślony jestem również termin „rachunek lambda”.
Jaka jest różnica między funkcją a lambda?
źródło
I wonder if 'lambda' has some esoteric meaning, seeing that the Greek letter lambda (λ) appears in so many avatars on this site.
Można by mieć nadzieję, że byłoby to w odniesieniu do rachunku lambda, ale mam dziwne przeczucie, że Half Life jest winny awatarom lambda.Odpowiedzi:
Słowo „lambda” lub „wyrażenia lambda” najczęściej odnosi się do funkcji anonimowych. W tym sensie lambda jest rodzajem funkcji, ale nie każda funkcja jest lambda (tzn. Nazwane funkcje zwykle nie są nazywane lambdami). W zależności od języka funkcje anonimowe są często implementowane inaczej niż funkcje nazwane (szczególnie w językach, w których funkcje anonimowe są zamknięciami, a funkcje nazwane nie są), więc odwołanie się do nich za pomocą innych terminów może mieć sens.
Różnica między słowem kluczowym lambda schematu a słowem kluczowym funkcji Javascript polega na tym, że tego ostatniego można używać zarówno do tworzenia anonimowych funkcji, jak i nazwanych funkcji, podczas gdy ten pierwszy tworzy tylko funkcje anonimowe (i można by użyć
define
do tworzenia nazwanych funkcji).Rachunek lambda jest minimalnym językiem programowania / modelem matematycznym obliczeń, który wykorzystuje funkcje jako jedyną „strukturę danych”. W rachunku lamdba symbol lambda służy do tworzenia (anonimowych) funkcji. Stąd bierze się użycie terminu „lambda” w innych językach.
źródło
define
(lublet
jednego z jego krewnych albo definicji wewnętrznej) - to wszystko. Nie ma nic specjalnego wdefine
odniesieniu do funkcji.define
nie ma specjalnego formularza definiowania funkcji (czyli można napisać(define (f x) (foo))
zamiast(define f (lambda (x) (foo)))
), ale chodzi mi o to, że nie można stworzyć za pomocą funkcji o nazwielambda
sam, czyli nie można napisać coś jak(lambda f (x) (foo))
zdefiniować funkcję o nazwief
który wymaga jednego argumentu, tak jak w przypadkufunction
słowa kluczowego Javascript .define
ma to jako cukier składniowy, więc nie jest tak ważne, jak jego rola jako narzędzia wiążącego nazwy dla wszystkich wartości. Co do tego, żelambda
nie tworzy nazwy sam w sobie: to ważna cecha, ponieważ oddziela ona dawanie nazwy od formularzy funkcyjnych ... IMO JS robi dobrze, pozwalając na separację, jednocześnie akceptując opcjonalną nazwę dla tych mas, które byłyby przerażone pomysł na funkcję bez nazwy. (I na szczęście wielkość tych mas ogólnie spada ...)Lambda jest po prostu funkcją anonimową - funkcją bez nazwy.
źródło
lambda
wyrażenie w Schemacie jest jakfunction
wyrażenie bez imienia - ale nic nie stoi na przeszkodzie, aby później nadać im nazwę. Na przykładvar f = [function(x){return x;}][0]
. Można argumentować, że sama wartość funkcji nie ma nazwy, ale byłoby to prawdą dla wszystkich funkcji ...Odpowiedzi tutaj: https://stackoverflow.com/questions/16501/what-is-a-lambda-function
Zasadniczo Lambda jest funkcją anonimową.
źródło
W C # funkcja anonimowa to ogólny termin, który obejmuje zarówno wyrażenia lambda, jak i metody anonimowe (metody anonimowe są instancjami delegowanymi bez faktycznej deklaracji metody).
Wyrażenia lambda można podzielić na wyrażenie lambda i wyrażenie lambda
Wyrażenie lambda:
Instrukcja lambda jest podobna do wyrażenia lambda, z tą różnicą, że instrukcje są ujęte w nawiasy klamrowe:
Kiedy mówimy o wyrażeniach lambda w JavaScript, oznacza to po prostu użycie funkcji jako argumentu w wywołaniu innej funkcji.
źródło
TL; DR Jak zauważyli inni: notacja lambda to tylko sposób na zdefiniowanie funkcji bez konieczności nadawania im nazwy.
Długa wersja
Chciałbym trochę rozwinąć ten temat, ponieważ uważam go za bardzo interesujący. Zastrzeżenie: Dawno temu podjąłem kurs na rachunku lambda. Jeśli ktoś z lepszą wiedzą znajdzie jakieś nieścisłości w mojej odpowiedzi, nie krępuj się, pomóż mi ją poprawić.
Zacznijmy wyrażeń, np
1 + 2
ix + 2
. Literały takie jak1
i2
są nazywane stałymi, ponieważ są powiązane z określonymi stałymi wartościami.Identyfikator taki jak
x
nazywany jest zmienną. Aby go ocenić, najpierw musisz powiązać go z pewną wartością. Zasadniczo nie możesz oceniać,x + 1
dopóki nie wiesz, cox
jest.Notacja lambda zapewnia schemat wiązania określonych wartości wejściowych ze zmiennymi. Ekspresji lambda może być utworzony przez dodanie
λx .
przed istniejącym ekspresji, npλx . x + 1
. Zmiennax
jest uważane za darmo wx + 1
i związany wλx . x + 1
W jaki sposób pomaga to w ocenie wyrażeń? Jeśli podasz wartość do wyrażenia lambda, to tak
następnie możesz ocenić całe wyrażenie, zastępując (wiążąc) wszystkie wystąpienia zmiennej
x
wartością 2:Tak więc notacja lambda zapewnia ogólny mechanizm wiązania rzeczy ze zmiennymi pojawiającymi się w bloku wyrażenia / programu. W zależności od kontekstu tworzy to wyraźnie różne pojęcia w językach programowania:
Oprócz różnic notacja lambda polega na zdefiniowaniu parametrów formalnych i powiązaniu ich z parametrami rzeczywistymi.
Następnym krokiem jest nadanie funkcji / procedurze nazwy. W kilku językach funkcje są jak wszystkie inne, więc możesz nadać funkcji następującą nazwę:
Jak zauważył Eli Barzilay, te definicje po prostu wiążą nazwę
f
z wartością, która okazuje się funkcją. W związku z tym funkcje, liczby, ciągi znaków, wszystkie wartości, które można przypisać do nazw w ten sam sposób:W tych językach można również powiązać funkcję z nazwą, używając bardziej znanej (ale równoważnej) notacji:
Niektóre języki, np. C, obsługują tylko ten ostatni zapis do definiowania (nazwanych) funkcji.
Domknięcia
Kilka uwag końcowych dotyczących zamknięć . Rozważ wyrażenie
x + y
. Zawiera dwie wolne zmienne. Jeśli połączysz sięx
za pomocą notacji lambda, otrzymasz:To nie jest (jeszcze) funkcja, ponieważ nadal zawiera wolną zmienną
y
. Możesz zrobić z niego funkcję, wiążący
również:lub
który jest taki sam jak
+
funkcja.Ale możesz powiązać, powiedzmy,
y
w inny sposób (*):Wynikiem zastosowania funkcji incrementBy do liczby jest zamknięcie, tj. Funkcja / procedura, której treść zawiera dowolną zmienną (np.
y
), Która została powiązana z wartością ze środowiska, w którym zdefiniowano zamknięcie.Podobnie
incrementBy 5
jest z funkcją (zamknięcie), która zwiększa liczby o 5.UWAGA (*)
Trochę tu oszukuję:
jest równa
więc mechanizm wiązania jest taki sam. Intuicyjnie myślę, że zamknięcie reprezentuje fragment bardziej złożonego wyrażenia lambda. Po utworzeniu tej reprezentacji niektóre wiązania wyrażenia macierzystego zostały już ustawione, a zamknięcie używa ich później, gdy zostanie ocenione / wywołane.
źródło
„Lambda” w programowaniu zwykle oznacza „funkcję lambda” (lub także „wyrażenie lambda”, „termin lambda”). Gdy funkcja jest nazwanym blokiem kodu zdefiniowanym przed użyciem, „funkcja lambda” to blok kodu (lub wyrażenie) zdefiniowany zamiast użycia, który może być używany jako obywatel pierwszej klasy w języku programowania.
W JavaScript ES6 (2015) istnieje krótka składnia definiująca lambdy o nazwie „Funkcje strzałek” . W języku C # taka składnia została wprowadzona w .NET 3.0 (około 2006) .
W matematyce pojęcie „funkcja” ma kilka znaczeń, w których jedno z nich dotyczy notacji funkcji (tj. Jak ją zapisać), a następnie „funkcja lambda” (w rachunku różniczkowym) jest szczególnym rodzajem notacji funkcji. Aby uzyskać więcej dyskusji, sprawdź funkcje lambda w językach programowania .
źródło