Dla osoby bez wykształcenia specjalistycznego, czym jest lambda w świecie informatyki?
lambda
language-agnostic
computer-science
terminology
theory
Brian Warshaw
źródło
źródło
Odpowiedzi:
Lambda pochodzi z Lambda Calculus i odnosi się do anonimowych funkcji w programowaniu.
Dlaczego to jest fajne? Pozwala pisać funkcje szybkiego wyrzucania bez nazywania ich. To także dobry sposób na pisanie zamknięć. Dzięki tej mocy możesz robić takie rzeczy.
Pyton
Jak widać z fragmentu Pythona, sumator funkcji przyjmuje argument x i zwraca funkcję anonimową lub lambda, która przyjmuje inny argument y. Ta anonimowa funkcja umożliwia tworzenie funkcji na podstawie funkcji. Jest to prosty przykład, ale powinien przekazać moc lambdas i zamknięć.
Przykłady w innych językach
Perl 5
JavaScript
JavaScript (ES6)
Schemat
C # 3.5 lub wyższy
Szybki
PHP
Haskell
Java zobacz ten post
Lua
Kotlin
Rubin
Ruby różni się nieco tym, że nie można wywoływać lambda przy użyciu dokładnie takiej samej składni, jak wywoływanie funkcji, ale nadal ma lambdy.
Ruby jako Ruby, istnieje skrót dla lambdas, więc możesz zdefiniować w
adder
ten sposób:R
źródło
Lambda jest rodzajem funkcji zdefiniowanym wewnętrznie. Wraz z lambda zwykle masz też pewien rodzaj zmiennej zmiennej, która może zawierać odniesienie do funkcji, lambda lub innej.
Na przykład, oto fragment kodu C #, który nie używa lambda:
To wywołuje Kalkulator, przekazując nie tylko dwie liczby, ale także metodę wywoływania wewnątrz Kalkulatora w celu uzyskania wyników obliczeń.
W C # 2.0 mamy anonimowe metody, które skracają powyższy kod do:
A potem w C # 3.0 mamy lambdas, co czyni kod jeszcze krótszym:
źródło
Op
, można po prostu użyćFunc<int, int>
Console.WriteLine("Calculator: op " + op.Method.Name + " (" + a + ", " + b + ") = " + op(a, b));
pierwszy przykład.Nazwa „lambda” jest tylko historycznym artefaktem. Mówimy tylko o wyrażeniu, którego wartość jest funkcją.
Prostym przykładem (użycie Scali do następnego wiersza) jest:
gdzie argumentem
foreach
metody jest wyrażenie dla funkcji anonimowej. Powyższa linia jest mniej więcej taka sama jak pisanie czegoś takiego (niezupełnie prawdziwy kod, ale wpadniesz na pomysł):poza tym, że nie musisz zawracać sobie głowy:
Kiedy już przyzwyczaisz się do funkcji wartości, rezygnacja z nich wydaje się równie głupie, jak wymawianie nazw wszystkich wyrażeń, takich jak:
zamiast pisać wyrażenie tam, gdzie jest ono potrzebne:
Dokładna notacja różni się w zależności od języka; Grecki nie zawsze jest wymagany! ;-)
źródło
Odnosi się do rachunku lambda , który jest systemem formalnym, który ma tylko wyrażenia lambda, które reprezentują funkcję, która przyjmuje funkcję za swój jedyny argument i zwraca funkcję. Wszystkie funkcje w rachunku lambda są tego typu, tj
λ : λ → λ
.Lisp użył pojęcia lambda do nazwania swoich anonimowych literałów funkcji. Ta lambda reprezentuje funkcję, która przyjmuje dwa argumenty, xiy, i zwraca ich produkt:
Można go zastosować w linii w ten sposób (ocenia na 50 ):
źródło
λ : λ -> λ
jest mylące (i faktycznie nieważne).Rachunek lambda jest spójną matematyczną teorią podstawienia. W szkolnej matematyce widzi się na przykład w
x+y=5
połączeniu zx−y=1
. Wraz ze sposobami manipulowania poszczególnymi równaniami można również łączyć informacje z tych dwóch razem, pod warunkiem, że podstawienia równania krzyżowego są wykonywane logicznie. Rachunek lambda kodyfikuje prawidłowy sposób dokonywania tych zamian.Biorąc pod uwagę, że
y = x−1
jest to poprawna zmiana drugiego równania,λ y = x−1
oznacza to: funkcję zastępującą symbolex−1
symbolemy
. Teraz wyobraź sobie, że możesz zastosowaćλ y
do każdego terminu w pierwszym równaniu. Jeśli termin jesty
następnie, wykonaj podstawienie; w przeciwnym razie nic nie rób. Jeśli zrobisz to na papierze, zobaczysz, jak to zastosowaćλ y
sprawi, że pierwsze równanie będzie możliwe do rozwiązania.To odpowiedź bez informatyki i programowania.
Najprostszy przykład programowania, jaki mogę wymyślić, pochodzi z http://en.wikipedia.org/wiki/Joy_(programming_language)#How_it_works :
Dodano: http://imgur.com/a/XBHub
źródło
Nieco uproszczone: funkcja lambda to taka, którą można przekazać do innych funkcji i uzyskać dostęp do logiki.
W języku C # składnia lambda jest często kompilowana do prostych metod w taki sam sposób, jak anonimowi delegaci, ale można ją również rozbić i odczytać jej logikę.
Na przykład (w C # 3):
LinqToSql może odczytać tę funkcję (x> 15) i przekonwertować ją na rzeczywisty SQL w celu wykonania za pomocą drzew wyrażeń.
Powyższe oświadczenie staje się:
Różni się to od zwykłych metod lub anonimowych delegatów (które są tak naprawdę magią kompilatora), ponieważ nie można ich odczytać .
Nie wszystkie metody w języku C #, które używają składni lambda, można skompilować do drzew wyrażeń (tj. Rzeczywistych funkcji lambda). Na przykład:
Teraz nie można odczytać drzewa wyrażeń - SomeComplexCheck nie może zostać rozbity. Instrukcja SQL zostanie wykonana bez gdzie, a każdy wiersz w danych zostanie wprowadzony
SomeComplexCheck
.Funkcji Lambda nie należy mylić z metodami anonimowymi. Na przykład:
Ma również funkcję „wbudowaną”, ale tym razem jest to po prostu magia kompilatora - kompilator C # podzieli to na nową metodę instancji z automatycznie generowaną nazwą.
Nie można odczytać anonimowych metod, więc logika nie może zostać przetłumaczona tak jak w przypadku funkcji lambda.
źródło
Podoba mi się wyjaśnienie Lambdas w tym artykule: Ewolucja LINQ i jej wpływ na projekt C # . Ma to dla mnie wiele sensu, ponieważ pokazuje prawdziwy świat dla Lambdas i buduje go jako praktyczny przykład.
Szybkie wyjaśnienie: Lambda to sposób na traktowanie kodu (funkcji) jako danych.
źródło
Przykład lambda w Ruby jest następujący:
Wygeneruje następujące dane wyjściowe:
źródło
@Brian Cały czas używam lambd w C #, w operatorach LINQ i innych niż LINQ. Przykład:
Przed C # użyłem anonimowych funkcji w JavaScript do wywołań zwrotnych funkcji AJAX, zanim jeszcze stworzono termin Ajax:
Interesującą rzeczą w składni lambda C # jest to, że same nie mogą być wpisane do ich typu (tzn. Nie można wpisać var foo = (x, y) => x * y), ale w zależności od typu przypisane do nich zostaną skompilowane jako delegaty lub abstrakcyjne drzewa składniowe reprezentujące wyrażenie (w ten sposób mapujący obiekty LINQ wykonują swoją magię „zintegrowaną z językiem”).
Lambdas w LISP można również przekazać do operatora oferty, a następnie przejść jako listę list. Niektóre potężne makra są tworzone w ten sposób.
źródło
Odpowiedź na to pytanie jest bardzo formalna, więc nie będę próbował dodawać więcej na ten temat.
W bardzo prostych, nieformalnych słowach do kogoś, kto niewiele wie lub nic nie zna matematyki ani programowania, wytłumaczyłbym to jako małą „maszynę” lub „skrzynkę”, która pobiera dane wejściowe, działa i generuje dane wyjściowe, nie ma konkretnej nazwy , ale wiemy, gdzie to jest i dzięki tej wiedzy korzystamy z niej.
Praktycznie rzecz biorąc, dla osoby, która wie, co to jest funkcja, powiedziałbym jej, że jest to funkcja bez nazwy, zwykle umieszczona w pamięci, do której można się odwołać po prostu przez odwołanie się do tej pamięci (zwykle poprzez użycie zmienna - jeśli usłyszeli o koncepcji wskaźników funkcji, użyłbym ich jako podobnej koncepcji) - ta odpowiedź obejmuje ładne podstawy (bez wzmianki o zamknięciach itp.), ale można łatwo zdobyć punkt.
źródło
Możesz myśleć o tym jak o funkcji anonimowej - oto kilka informacji: Wikipedia - Funkcja anonimowa
źródło
Tylko dlatego, że nie widzę tutaj przykładu w C ++ 11, napiszę ten miły przykład stąd . Po przeszukaniu jest to najczystszy przykład, jaki mogłem znaleźć w języku.
Witaj, Lambdas, wersja 1
Witaj, Lambdas, wersja 2:
źródło
Mam problem z owinięciem głowy wyrażeniami lambda, ponieważ pracuję w programie Visual FoxPro, który ma podstawienie makr oraz funkcje ExecScript {} i Evaluate (), które wydają się służyć temu samemu celowi.
Jedną wyraźną korzyścią z używania formalnych lambdas jest (zakładam) sprawdzanie czasu kompilacji: Fox nie będzie wiedział, czy literówka powyżej, dopóki nie spróbuje go uruchomić.
Jest to również przydatne w przypadku kodu opartego na danych: możesz przechowywać całe procedury w polach notatek w bazie danych, a następnie po prostu je oceniać w czasie wykonywania. Pozwala to na dostosowanie części aplikacji bez faktycznego dostępu do źródła. (Ale to zupełnie inny temat.)
źródło
Zilustruję go intuicyjnie krok po kroku w prostych i czytelnych kodach Pythona.
Krótko mówiąc, lambda jest po prostu anonimową i wbudowaną funkcją.
Zacznijmy od zadania, aby zrozumieć
lambdas
jako student pierwszego roku z podstawową arytmetyką.Plan przypisania to „nazwa = wartość”, patrz:
„x”, „y” to nazwy, a 1, „wartość” to wartości. Wypróbuj funkcję w matematyce
Raporty o błędach,
nie można pisać matematyki bezpośrednio jako kodu, należy zdefiniować „n” lub przypisać do wartości.
Działa teraz, co jeśli nalegasz na połączenie dwóch oddzielnych linii w jedną. Nadchodzi
lambda
Nie zgłoszono błędów.
To spojrzenie na
lambda
to, że pozwala napisać funkcję w jednym wierszu, podobnie jak w matematyce, bezpośrednio do komputera.Zobaczymy to później.
Kontynuujmy głębsze kopanie „zadania”.
Jak pokazano powyżej, symbol równości
=
działa dla prostego typu danych (1 i „wartość”) i prostego wyrażenia (n ** 2 + 2 * n + 1).Spróbuj tego:
Działa dla prostych instrukcji, w Pythonie jest ich 11 rodzajów . Proste instrukcje - dokumentacja Python 3.6.3
Co powiesz na wyrażenie złożone,
Istnieje możliwość
def
włączeniaTada, przeanalizuj to, „m” to nazwa, „n ** 2 + 2 * n + 1” to wartość.
:
jest wariantem „=”.Znajdź, jeśli tylko dla zrozumienia, wszystko zaczyna się od zadania i wszystko jest zadaniem.
Teraz wróć do
lambda
, mamy funkcję o nazwie „m”Próbować:
Istnieją tutaj dwie nazwy „m”, funkcja
m
ma już nazwę, jest zduplikowana.Formatuje jak:
To nie jest inteligentna strategia, więc raporty o błędach
Musimy usunąć jeden z nich, ustawić funkcję bez nazwy.
Nazywa się to „funkcją anonimową”
Podsumowując
lambda
w funkcji wbudowanej, która umożliwia pisanie funkcji w jednej linii prostej, podobnie jak w matematycelambda
jest anonimowyMam nadzieję że to pomoże.
źródło
Jest to funkcja, która nie ma nazwy. Na przykład w c # możesz użyć
aby zwrócić liczby większe niż 5.
jest tutaj część lambda. Reprezentuje funkcję, która przyjmuje parametr (liczbę) i zwraca wartość logiczną (liczba> 5). Metoda GetMatchingItems używa tej lambda do wszystkich elementów w kolekcji i zwraca pasujące elementy.
źródło
W JavaScripcie, na przykład, są traktowane jako funkcje tego samego typu mieszanego, jak wszystkiego innego (
int
,string
,float
,bool
). Jako takie, możesz tworzyć funkcje w locie, przypisywać je do rzeczy i oddzwaniać później. Jest to przydatne, ale nie jest to coś, co chcesz nadużywać, inaczej wprowadzisz w błąd wszystkich, którzy muszą utrzymywać kod po tobie ...Oto kod, z którym bawiłem się, aby zobaczyć, jak głęboko schodzi ta królicza nora:
źródło
W kontekście CS funkcja lambda jest abstrakcyjną koncepcją matematyczną, która rozwiązuje problem symbolicznej oceny wyrażeń matematycznych. W tym kontekście funkcja lambda jest taka sama jak termin lambda .
Ale w językach programowania jest coś innego. Jest to fragment kodu, który jest zadeklarowany jako „na miejscu” i który można przekazać jako „obywatel pierwszej klasy”. Ta koncepcja wydawała się przydatna, ponieważ pojawiła się w prawie wszystkich popularnych współczesnych językach programowania (patrz funkcje lambda w dowolnym miejscu).
źródło
Zobaczmy, jak działa Lambda (zamknięcie) w Swift 4.2 z metodą sorted () - od normalnej funkcji do najkrótszego wyrażenia:
1. Funkcja normalna
2. Wyrażenie zamknięcia
3. Wyrażenie zamknięcia w linii
4. Wnioskowanie typu z kontekstu
5. Domniemane zwroty z zamknięć z pojedynczym wyrażeniem
6. Skrócone nazwy argumentów
7. Metody operatora
Mam nadzieję że to pomoże.
źródło
Ja też to mam. Próbowałem tego w JS z tym:
Dodaje 2 do 4, a następnie zwielokrotnia wynik przez 6. Jednak czasami trudno mi to przeczytać :(
Stworzyłem również ciekawą funkcję forEach:
forEach ([1,2,3,4,5]) (console.log);
Ta metoda iteruje tablicę i wykonuje akcję - w przypadku drukowania na konsoli. Teraz też rozumiem, dlaczego labmdas są potężne.
źródło
W programowaniu komputerowym lambda to fragment kodu (instrukcja, wyrażenie lub ich grupa), który pobiera pewne argumenty z zewnętrznego źródła. Nie zawsze musi to być funkcja anonimowa - mamy wiele sposobów na ich wdrożenie.
Mamy wyraźny rozdział między wyrażeniami, stwierdzeniami i funkcjami, których matematycy nie mają.
Słowo „funkcja” w programowaniu jest również inne - mamy „funkcja” to seria kroków do zrobienia (od łacińskiego „perform”). W matematyce chodzi o korelację między zmiennymi.
Języki funkcjonalne starają się być jak najbardziej podobne do formuł matematycznych, a ich słowa oznaczają prawie to samo. Ale w innych językach programowania jest inaczej.
źródło
Odpowiedź na pytanie jest wyczerpująca, nie chcę wchodzić w szczegóły. Chcę podzielić się użytkowaniem podczas pisania obliczeń numerycznych w rdzeniu.
Istnieje przykład lambda (funkcja anonimowa)
Kiedy pisałem moduł metody Newtona – Raphsona, był on używany jako pochodna pierwszego i drugiego rzędu. (Jeśli chcesz wiedzieć, co to jest metoda Newtona – Raphsona, odwiedź „ https://en.wikipedia.org/wiki/Newton%27s_method ”.
Dane wyjściowe są następujące
źródło
Wyobraź sobie, że masz restaurację z opcją dostawy i masz zamówienie, które musi zostać zrealizowane w mniej niż 30 minut. Chodzi o to, że klienci zwykle nie dbają o to, czy wysyłasz jedzenie na rowerze samochodem lub boso, o ile danie jest ciepłe i związane. Przekształćmy więc ten idiom w JavaScript z anonimowymi i zdefiniowanymi funkcjami transportowymi.
Poniżej zdefiniowaliśmy sposób dostarczania aka, definiujemy nazwę funkcji:
Co jeśli użyjemy funkcji strzałek / lambda do wykonania tego transferu:
Widzisz, nie ma różnicy dla klienta i nie marnujesz czasu na zastanawianie się, jak wysłać jedzenie. Po prostu to wyślij.
Przy okazji, nie polecam kebapa z colą, dlatego górne kody dadzą ci błędy. Baw się dobrze.
źródło