Co to jest język lambda?

90

Czytałem „JavaScript: dobre części” i autor wspomina, że ​​JavaScript jest pierwszym z uruchomionych języków lambda.

Funkcje JavaScript są obiektami pierwszej klasy z (głównie) zakresem leksykalnym. JavaScript jest pierwszym językiem lambda, który wszedł do głównego nurtu. W głębi duszy JavaScript ma więcej wspólnego z Lisp i Scheme niż z Javą. To Lisp w ubraniu C. To sprawia, że ​​JavaScript jest niezwykle potężnym językiem.

Nie rozumiem, co to jest język lambda. Jakie właściwości ma taki język i czym różni się od języków takich jak Java, C, C ++ i Php?

sushil bharwani
źródło
6
Lambda oznacza anonimowe wyrażenie. Czyli język lambda -> język z anonimowymi wyrażeniami
bevacqua
Link do Google Books, FYI: books.google.co.uk/…
Lucas Jones
3
Zobacz rachunek lambda na Wikipedii.
Oded
wiele dobrych odpowiedzi. Zdecydowanie zrozumiałem, że jeśli używasz funkcji anonimowej, pracujesz nad językiem lambda. jest to poprawne zrozumienie, czym różnią się języki lamda od języka takiego jak java.
sushil bharwani
4
„Czytałem„ JavaScript: dobre części ”i autor wspomina, że ​​JavaScript jest pierwszym z uruchomionych języków lambda”. Więc wyszukałem w Google język lambda i znalazłem to pytanie na SO :)
Bugs Bunny,

Odpowiedzi:

38

Nigdy nie słyszałem, żeby ktokolwiek używał terminu „język lambda”, a jedyne prawdopodobne definicje, jakie przychodzą mi do głowy, wykluczałyby JavaScript jako „pierwszy”.

To powiedziawszy, podejrzewam, że może mieć na myśli:

  • Języki funkcjonalne: klasa języków, w których obliczenia są (lub mogą być) modelowane jako bezstanowe zestawienie funkcji (prawdopodobnie wyższego rzędu). LISP, Scheme, ML, Haskell itp. Są często przypisywane do tej klasy, chociaż kilka z nich to bardziej właściwie mieszane języki paradygmatu lub „funkcjonalne języki opcjonalne”. Javascript prawdopodobnie zawiera niezbędne funkcje umożliwiające stworzenie „funkcjonalnego stylu” programowania.
  • Języki, które umożliwiają tworzenie funkcji anonimowych (przy użyciu functionskładni JavaScript; jest to napisane lambdaw wielu językach, stąd prawdopodobnie „języki lambda”.

Oba zwyczaje wywodzą się z użycia greckiej litery lambda do oznaczenia abstrakcji funkcji w rachunku lambda, modelu obliczeń opracowanym przez Alonzo Churcha, na którym opiera się programowanie funkcjonalne.

Edycja: spojrzałem na wynik w Książkach Google --- "pierwszy do głównego nurtu"; cóż, to dyskusyjne. Stwierdziłem, że LISP był w pewnym momencie przynajmniej rozsądnie głównym nurtem. To słuszna uwaga, semantyka JavaScript jest bezpośrednio inspirowana schematem iz pewnością dotarła do większej liczby odbiorców niż jakikolwiek inny język, który może wysuwać podobne twierdzenia.

Derrick Turk
źródło
proszę zobaczyć link opublikowany przez Lucasa Jonesa w Google book, gdzie prowadzi on do dokładnie tej strony, o której mówię. dzięki za twoją odpowiedź.
sushil bharwani
5
Powodem, dla którego JavaScript jest opisywany jako „pierwszy”, jest to, że instrukcja zawiera sformułowanie „iść do głównego nurtu”. Myślę, że jest całkiem jasne, że JavaScript jest rzeczywiście pierwszym językiem funkcjonalnym używanym na co dzień przez programistów w codziennej pracy.
rfunduk
1
co masz na myśli, mówiąc „funkcjonalny styl” języka programowania. Jestem z tła Java i próbuję nauczyć się javascript, czym się różni.
sushil bharwani
9
To ogromny temat do zbadania. W zeszłym roku byłem tam, gdzie teraz jesteś: znalazłem eseje i wykłady Crockforda i chciałem zrozumieć zamknięcia. Poleciłbym zacząć od Wikipedii, a następnie przejść do kilku esejów: John Hughes „Dlaczego programowanie funkcjonalne ma znaczenie” scribd.com/doc/26902/whyfp , Slava Akhmechet „Programowanie funkcjonalne dla reszty z nas” defmacro.org/ramblings /fp.html Istnieje wiele książek, które pomogą Ci rozwinąć umysł: zapoznaj się z Małym intrygantem, aby poznać schemat, a następnie przejdź do struktury i interpretacji programów komputerowych.
michiakig
5
@sushil: jest dużo literatury wprowadzającej na ten temat. Jednak ogólnie rzecz biorąc, jest to styl programowania, który kładzie nacisk na traktowanie programów jako obiektów matematycznych, a nie sekwencyjnych instrukcji lub interakcji między abstrakcyjnymi obiektami. Na przykład języki funkcyjne będą preferować rekurencję od iteracji, wykorzystywać niezmienne struktury danych i używać funkcji wyższego rzędu zamiast „obiektów funkcji” lub „wzorców strategii”. Funkcje wyższego rzędu oznaczają funkcje, które mogą operować (jako argumenty) lub dawać (jako wartości zwracane) inne funkcje.
Derrick Turk
48

Mówiąc prościej, język lambda to język, który umożliwia przekazanie funkcji do innej funkcji, przy czym funkcja ta jest traktowana jak każda inna zmienna. Powinieneś także móc zdefiniować tę funkcję, aby była przekazywana anonimowo (lub w tekście). PHP 5.3 dodał obsługę funkcji lambda. Czy JavaScript był pierwszym głównym językiem? Lisp był szeroko stosowany w ustawieniach edukacyjnych przed JavaScriptem, a także w dostosowywaniu naszego ukochanego Emacsa http://www.gnu.org/software/emacs/manual/html_node/eintr/

Oto przykład

function applyOperation(a, b, operation) {
  return operation(a,b);
}

function add(a,b) { return a+ b; }
function subtract(a,b) {return a - b;}

// Can be called like
applyOperation(1,2, add);
applyOperation(4,5, subtract);
// Anonymous inline function
applyOperation(4,7, function(a,b) {return a * b})

Czym różni się od C? W C możesz przekazać wskaźnik do funkcji, ale nie możesz zdefiniować go anonimowo.

W Javie (przed wersją 8), aby osiągnąć ten sam efekt, należy przekazać obiekt implementujący interfejs, który w rzeczywistości można zdefiniować anonimowo w tekście.

Juan Mendes
źródło
1
„Lisp był szeroko używany” przez kogo? Wiedziałem o tym zawsze, ponieważ profesorowie zawsze o tym dyskutowali, ale w praktyce nigdy nie spotkałem nikogo, kto używałby Lispa. Powiedziałbym, że każdy może znaleźć kogoś, kogo zna, kto używał Javascript, co sprawia, że ​​Javascript jest bardziej „mainstreamowy”.
palswim
„W PHP 5 dodano obsługę funkcji lambda”. Właściwie to było PHP 5.3, które wprowadziło funkcje lambda.
Crozin
Spotkałem kilka osób, które używały go w kontekście biznesowym, ale podobnie jak kiedyś Pascal, jest szeroko stosowany w środowisku edukacyjnym.
Juan Mendes,
4

Odnosi się do rachunku Lambda .

Rachunek lambda, również zapisywany jako rachunek λ, jest formalnym systemem definiowania funkcji, stosowania funkcji i rekurencji. […]

[...] z nietypowym rachunkiem lambda będącym oryginalną inspiracją dla programowania funkcjonalnego, w szczególności Lispa, oraz typowanych rachunków lambda stanowiących podstawę nowoczesnych systemów typów.

BenoitParis
źródło
4

Widziałem lambdę zdefiniowaną jako funkcja anonimowa i jako odniesienie do funkcji. Javascript obsługuje oba:

setTimeout(function(){ /* an anonymous function */ }, 100)

var f = function(){ /* function ref */ }

W tym miejscu JS uzyskuje dużą moc i elastyczność. Java obsługuje do pewnego stopnia pierwszą (implementacje anonimowych interfejsów), ale nie drugą - zobacz poniżej aktualizację dla Java 8.

Nie jest dla mnie jasne, która z nich (lub obie) jest właściwą definicją lambdy.

JS zdecydowanie nie jest pierwszym językiem obsługującym te funkcje. Wychodząc z pamięci, myślę, że to drobiazg, że entuzjaści języków zawsze zachwycają się wspieraniem lambd.

BTW: W Javie, klasa anonimowa jest zwykle używana do przekazywania definicji klasy w locie dla argumentu (często używana w ruchu). Coś takiego (z pamięci, nieskompilowane):

someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

Aktualizacja

Java, od 8, jest teraz oficjalnie językiem Lambda.

Możesz teraz użyć następującej składni:

MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

Źródło kodu

mtyson
źródło
1

W otwartym kursie MIT zatytułowanym struktura i interpretacja programów komputerowych jest to książka autorstwa Hala Abelsona, Jerry'ego Sussmana i Julie Sussman. Omawiają Schemat, który jest dialektem LISP-a i tam wyjaśniają bardzo szczegółowe i jasne wyjaśnienie czym jest lambda i Schemat LISP-a oraz języki w ogóle. Gorąco polecam przyjrzeć się temu, jeśli chcesz mieć naprawdę jasne i głębokie zrozumienie programowania komputerowego. Wyjaśnienie ci zajęłoby trzy razy więcej czasu, niż gdybyś tam poszedł i po prostu przeczytał książkę lub obejrzał samouczki, które doskonale to wyjaśniają, to genialne.

Javascript jest oparty głównie na języku Scheme i jest ojcem Lispa, a ponadto wziął swoją strukturę lamda i wszedł z nim do głównego nurtu.

Maks
źródło
0

Z Wikipedii: W językach programowania, takich jak Lisp i Python, lambda jest operatorem używanym do oznaczania anonimowych funkcji lub domknięć, po zastosowaniu rachunku lambda. Przykładem zastosowania lambdy w języku Python jest ta sekcja kodu komputerowego, która sortuje listę alfabetycznie według ostatniego znaku każdego wpisu:

>>> list = ['woman', 'man', 'horse', 'boat', 'plane', 'dog']
>>> sorted(list, key=lambda word: word[-1])
['horse', 'plane', 'dog', 'woman', 'man', 'boat']

* In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements
r3nrut
źródło
0
  • JavaScript pozwala zdefiniować funkcję anonimową, czyli funkcję, która nie jest powiązana z identyfikatorem. Taka funkcja jest również znana jako Lambda Abstraction, a ponieważ JS obsługuje tę funkcję, jest znana jako Lambda Language.

  • Właściwości: Ta funkcja jest potrzebna w przypadku natychmiastowego wykonania funkcji lub do krótkotrwałego użycia, gdy nie ma znaczenia nadawanie nazwy funkcji.

  • Różni się od języków takich jak Java, C, C ++ i PHP, ponieważ w JS Anonymous funkcje są używane do zamykania i curry.

MERLIN THOMAS
źródło