Co to jest Lambda?

93

Czy ktoś mógłby dobrze opisać, czym jest Lambda? Mamy dla nich tag i dotyczą one tajemnic pytania w języku C #, ale przede wszystkim nie znalazłem dobrej definicji i wyjaśnienia, czym one są.

Fred
źródło
1
A może na początek artykuł o rachunku lambda w Wikipedii ? Następnie artykuł Wikipedii o programowaniu funkcjonalnym jako kontynuacja.
Thorsten79
2
możliwy duplikat Co to jest lambda (funkcja)?
nawfal
Wyrażenie amda zostało tutaj pięknie wyjaśnione .
Jameer Mulani

Odpowiedzi:

135

Zamknięcia, lambdy i funkcje anonimowe niekoniecznie są tym samym.

Funkcja anonimowa to dowolna funkcja, która nie ma (lub przynajmniej nie potrzebuje) własnej nazwy.

Zamknięcie to funkcja, która może uzyskać dostęp do zmiennych, które znajdowały się w jego zakresie leksykalnym, gdy zostało zadeklarowane, nawet po tym, jak wypadły poza zakres. Funkcje anonimowe niekoniecznie muszą być zamknięciami, ale są w większości języków i stają się mniej przydatne, gdy nie są.

Lambda nie jest ... nie do końca tak dobrze zdefiniowana, jeśli chodzi o informatykę. Wiele języków nawet nie używa tego terminu; zamiast tego będą nazywać je po prostu domknięciami lub funkcjami lub wymyślą własną terminologię. W LISP-ie lambda to po prostu funkcja anonimowa. W Pythonie lambda to anonimowa funkcja ograniczona do pojedynczego wyrażenia; cokolwiek więcej i potrzebujesz nazwanej funkcji. Lambdy są zamknięciami w obu językach.

Eevee
źródło
termin może oznaczać rachunek lambda en.wikipedia.org/wiki/Lambda_calculus
Steven A. Lowe
Wow, mam więcej niż jeden głos za, aby zadać to pytanie. Widziałem tak wiele odpowiedzi technicznych ugrzęźniętych w terminologii, ale ta jest zwięzła i od razu wyjaśnia.
Matthew Stopa
8
+1 za niestosowanie terminu „zamknięcie” do zdefiniowania zamknięcia, tak jakby to czyniło je jaśniejszym.
Daniel
5
Region, w którym może istnieć jakaś zmienna (tj. Zakres) zdefiniowany przez strukturę twojego kodu (tj. Leksykalnie). Na przykład w większości języków funkcja definiuje zakres leksykalny; każda zmienna zadeklarowana wewnątrz funkcji jest niedostępna poza nią.
Eevee
19

Nazywany także domknięciami lub funkcjami anonimowymi. Najlepszy opis znalazłem tutaj . Zasadniczo, wbudowany blok kodu, który można przekazać jako argument do funkcji.

Gulzar Nazim
źródło
8

Jest to po prostu anonimowa funkcja zadeklarowana w tekście, najczęściej przypisywana delegatowi, gdy nie chcesz pisać pełnoprawnej funkcji.

W językach takich jak lisp / scheme często są one przekazywane dość swobodnie jako parametry funkcji, ale idiom w C # zazwyczaj znajduje lambdy używane tylko do leniwego oceniania funkcji, jak w linq, lub do uczynienia kodu obsługującego zdarzenia nieco bardziej rozwlekłym.

JasonTrue
źródło
5

W programowaniu nie ma czegoś takiego jak „lambda”. To zależy od języka itp.

Krótko mówiąc, zwykle język, który „ma lambdy”, używa terminu dla funkcji anonimowych lub, w niektórych przypadkach, domknięć. Tak jak w Rubim:

f = lambda { return "this is a function with no name" }
puts f.call
rfunduk
źródło
4

W odpowiedzi na poprzednie odpowiedzi:
- Ważną rzeczą w przypadku funkcji anonimowych nie jest to, że nie wymagają one nazwy.
-Zamknięcia to osobna koncepcja.
- Gigantyczny artykuł w Wikipedii nie wyjaśnia tego.

Oto moja odpowiedź w 3 częściach:
1. Lambda to funkcja, która jest również wyrażeniem. To jest ważna rzecz.
2. Wiele języków, które implementują tak zwane „lambdy”, dodaje trochę cukru syntaktycznego, aby ułatwić i przyspieszyć pisanie tych krótkich funkcji, ale nie jest to wymagane.
3. Niektóre języki mogą wymagać, aby lambda nie miało skutków ubocznych . To byłaby bardziej czysta lambda w sensie funkcjonalnym.

Kiedy funkcja jest wyrażeniem, jest „obywatelem pierwszej kategorii” w języku. Mogę z nim zrobić wszystkie ważne rzeczy:

x = lambda(){ return "Hello World"; }

doit( 1, 2, lambda(a,b){ return a > b; }, 3 )

x = (lambda(a){ return a+1; }) + 5  // type error, not syntax error

(lambda(a,b){ print(a); log(b); })( 1, 2 )  // () is valid operator here
cmeub
źródło
1

Wycięte z wikipedii: http://en.wikipedia.org/wiki/Lambda#Lambda.2C_the_word

W językach programowania, takich jak Lisp i Python, lambda jest operatorem używanym do oznaczania anonimowych funkcji lub domknięć po zastosowaniu rachunku lambda.

Siatka
źródło
Chyba miałeś na myśli tę linię: w językach programowania, takich jak Lisp i Python, lambda jest operatorem używanym do oznaczania anonimowych funkcji lub domknięć, po zastosowaniu rachunku lambda. Już zeskanowałem artykuł, ale przegapiłem to.
Fred