Was ist ein Lambda in der Welt der Informatik für eine Person ohne Comp-Sci-Hintergrund?
lambda
language-agnostic
computer-science
terminology
theory
Brian Warshaw
quelle
quelle
Antworten:
Lambda stammt aus dem Lambda-Kalkül und bezieht sich auf anonyme Funktionen in der Programmierung.
Warum ist das cool? Sie können damit schnell wegwerfbare Funktionen schreiben, ohne sie zu benennen. Es bietet auch eine gute Möglichkeit, Verschlüsse zu schreiben. Mit dieser Kraft können Sie solche Dinge tun.
Python
Wie Sie dem Python-Snippet entnehmen können, nimmt der Funktionsaddierer ein Argument x auf und gibt eine anonyme Funktion oder Lambda zurück, die ein anderes Argument y akzeptiert. Mit dieser anonymen Funktion können Sie Funktionen aus Funktionen erstellen. Dies ist ein einfaches Beispiel, aber es sollte die Kraft vermitteln, die Lambdas und Verschlüsse haben.
Beispiele in anderen Sprachen
Perl 5
JavaScript
JavaScript (ES6)
Planen
C # 3.5 oder höher
Schnell
PHP
Haskell
Java siehe diesen Beitrag
Lua
Kotlin
Rubin
Ruby unterscheidet sich insofern geringfügig, als Sie ein Lambda nicht mit genau der gleichen Syntax wie das Aufrufen einer Funktion aufrufen können, es jedoch weiterhin Lambdas enthält.
Da Ruby Ruby ist, gibt es eine Abkürzung für Lambdas. Sie können also Folgendes definieren
adder
:R.
quelle
Ein Lambda ist eine Art von Funktion, die inline definiert wird. Zusammen mit einem Lambda haben Sie normalerweise auch einen Variablentyp, der einen Verweis auf eine Funktion, ein Lambda oder etwas anderes enthalten kann.
Hier ist zum Beispiel ein C # -Code, der kein Lambda verwendet:
Dies ruft Calculator auf und gibt nicht nur zwei Zahlen weiter, sondern auch die Methode, die im Calculator aufgerufen werden muss, um die Ergebnisse der Berechnung zu erhalten.
In C # 2.0 haben wir anonyme Methoden erhalten, die den obigen Code verkürzen auf:
Und dann haben wir in C # 3.0 Lambdas bekommen, was den Code noch kürzer macht:
quelle
Op
, kann man einfachFunc<int, int>
Console.WriteLine("Calculator: op " + op.Method.Name + " (" + a + ", " + b + ") = " + op(a, b));
für das erste Beispiel vorschlagen .Der Name "Lambda" ist nur ein historisches Artefakt. Wir sprechen nur von einem Ausdruck, dessen Wert eine Funktion ist.
Ein einfaches Beispiel (mit Scala für die nächste Zeile) ist:
Dabei ist das Argument für die
foreach
Methode ein Ausdruck für eine anonyme Funktion. Die obige Zeile entspricht mehr oder weniger dem Schreiben von so etwas (nicht ganz realer Code, aber Sie werden auf die Idee kommen):außer dass Sie sich nicht darum kümmern müssen:
Sobald Sie es gewohnt sind, Werte zu funktionieren, erscheint es so dumm, auf sie verzichten zu müssen, wie es erforderlich ist, um jeden Ausdruck zu benennen, wie zum Beispiel:
anstatt nur den Ausdruck dort zu schreiben, wo Sie ihn brauchen:
Die genaue Notation variiert von Sprache zu Sprache. Griechisch ist nicht immer erforderlich! ;-);
quelle
Es bezieht sich auf den Lambda-Kalkül , ein formales System, das nur Lambda-Ausdrücke enthält, die eine Funktion darstellen, die eine Funktion als einziges Argument verwendet und eine Funktion zurückgibt. Alle Funktionen in der Lambda-Rechnung sind von diesem Typ, dh
λ : λ → λ
.Lisp verwendete das Lambda-Konzept, um seine anonymen Funktionsliterale zu benennen. Dieses Lambda stellt eine Funktion dar, die zwei Argumente, x und y, akzeptiert und ihr Produkt zurückgibt:
Es kann wie folgt inline angewendet werden (ergibt 50 ):
quelle
λ : λ -> λ
ist verwirrend (und tatsächlich ungültig).Der Lambda-Kalkül ist eine konsistente mathematische Substitutionstheorie. In der Schulmathematik sieht man zum Beispiel
x+y=5
gepaart mitx−y=1
. Neben Möglichkeiten zur Manipulation einzelner Gleichungen ist es auch möglich, die Informationen aus diesen beiden zusammenzustellen, vorausgesetzt, die Ersetzungen über Kreuzgleichungen erfolgen logisch. Der Lambda-Kalkül kodifiziert den richtigen Weg, um diese Substitutionen durchzuführen.Vorausgesetzt, dies
y = x−1
ist eine gültige Neuordnung der zweiten Gleichung,λ y = x−1
bedeutet dies: eine Funktion, diex−1
das Symbol durch die Symbole ersetzty
. Stellen Sie sich nun vor, Sie wendenλ y
auf jeden Term in der ersten Gleichung an. Wenn ein Begriff vorhanden ist,y
führen Sie die Ersetzung durch. sonst nichts tun. Wenn Sie dies auf Papier tun, werden Sie sehen, wie Sie das anwendenλ y
der ersten Gleichung die erste Gleichung lösbar wird.Das ist eine Antwort ohne Informatik oder Programmierung.
Das einfachste Programmierbeispiel, das ich mir vorstellen kann, stammt von http://en.wikipedia.org/wiki/Joy_(programming_language)#How_it_works :
Hinzugefügt: http://imgur.com/a/XBHub
quelle
Etwas vereinfacht: Eine Lambda-Funktion kann an andere Funktionen weitergegeben werden und auf ihre Logik wird zugegriffen.
In C # wird die Lambda-Syntax häufig wie anonyme Delegaten zu einfachen Methoden kompiliert, sie kann jedoch auch aufgeschlüsselt und ihre Logik gelesen werden.
Zum Beispiel (in C # 3):
LinqToSql kann diese Funktion lesen (x> 15) und sie in das eigentliche SQL konvertieren, um sie mithilfe von Ausdrucksbäumen auszuführen.
Die obige Aussage lautet:
Dies unterscheidet sich von normalen Methoden oder anonymen Delegaten (die eigentlich nur Compiler-Magie sind), da sie nicht gelesen werden können .
Nicht alle Methoden in C #, die Lambda-Syntax verwenden, können zu Ausdrucksbäumen kompiliert werden (dh zu tatsächlichen Lambda-Funktionen). Zum Beispiel:
Jetzt kann der Ausdrucksbaum nicht gelesen werden - SomeComplexCheck kann nicht zerlegt werden. Die SQL-Anweisung wird ohne das Wo ausgeführt, und jede Zeile in den Daten wird durchlaufen
SomeComplexCheck
.Lambda-Funktionen sollten nicht mit anonymen Methoden verwechselt werden. Zum Beispiel:
Dies hat auch eine 'Inline'-Funktion, aber diesmal ist es nur Compiler-Magie - der C # -Compiler teilt dies in eine neue Instanzmethode mit einem automatisch generierten Namen auf.
Anonyme Methoden können nicht gelesen werden, daher kann die Logik nicht wie bei Lambda-Funktionen übersetzt werden.
quelle
Ich mag die Erklärung von Lambdas in diesem Artikel: Die Entwicklung von LINQ und seine Auswirkungen auf das Design von C # . Es hat für mich sehr viel Sinn gemacht, da es eine reale Welt für Lambdas zeigt und sie als praktisches Beispiel darstellt.
Ihre schnelle Erklärung: Lambdas sind eine Möglichkeit, Code (Funktionen) als Daten zu behandeln.
quelle
Ein Beispiel für ein Lambda in Ruby lautet wie folgt:
Erzeugt die folgende Ausgabe:
quelle
@Brian Ich verwende Lambdas die ganze Zeit in C #, in LINQ- und Nicht-LINQ-Operatoren. Beispiel:
Vor C # habe ich anonyme Funktionen in JavaScript für Rückrufe auf AJAX-Funktionen verwendet, bevor der Begriff Ajax überhaupt geprägt wurde:
Das Interessante an der Lambda-Syntax von C # ist jedoch, dass ihr Typ allein nicht abgeleitet werden kann (dh Sie können var foo = (x, y) => x * y nicht eingeben), aber je nachdem, um welchen Typ es sich handelt zugewiesen, werden sie als Delegaten oder abstrakte Syntaxbäume kompiliert, die den Ausdruck darstellen (so machen LINQ-Objekt-Mapper ihre "sprachintegrierte" Magie).
Lambdas in LISP können auch an einen Angebotsoperator übergeben und dann als Listenliste durchlaufen werden. Auf diese Weise werden einige leistungsstarke Makros erstellt.
quelle
Die Frage wird formal sehr gut beantwortet, daher werde ich nicht versuchen, mehr dazu hinzuzufügen.
In sehr einfach, informell Worten an jemanden, der sehr wenig oder gar nichts über Mathematik oder Programmierung weiß, würde ich es als eine kleine "Maschine" oder "Box" erklären, die einige Eingaben nimmt, einige Arbeiten macht und einige Ausgaben erzeugt, keinen bestimmten Namen hat , aber wir wissen, wo es ist und nur durch dieses Wissen nutzen wir es.
In der Praxis würde ich einer Person, die weiß, was eine Funktion ist, sagen, dass es sich um eine Funktion ohne Namen handelt, die normalerweise an einen Punkt im Speicher gesetzt wird, der nur durch Verweisen auf diesen Speicher verwendet werden kann (normalerweise über die Verwendung von eine Variable - wenn sie von dem Konzept der Funktionszeiger gehört haben, würde ich sie als ähnliches Konzept verwenden) - diese Antwort deckt die hübschen Grundlagen ab (keine Erwähnung von Verschlüssen usw.), aber man kann den Punkt leicht verstehen.
quelle
Sie können sich das als anonyme Funktion vorstellen - hier einige weitere Informationen: Wikipedia - Anonyme Funktion
quelle
Nur weil ich hier kein C ++ 11-Beispiel sehen kann, werde ich dieses schöne Beispiel von hier aus veröffentlichen . Nach der Suche ist es das klarste sprachspezifische Beispiel, das ich finden konnte.
Hallo Lambdas, Version 1
Hallo Lambdas, Version 2:
quelle
Ich habe Probleme, mich mit Lambda-Ausdrücken zu beschäftigen, weil ich in Visual FoxPro arbeite, das über eine Makrosubstitution und die Funktionen ExecScript {} und Evaluate () verfügt, die anscheinend dem gleichen Zweck dienen.
Ein klarer Vorteil der Verwendung formaler Lambdas ist (ich nehme an) die Überprüfung der Kompilierungszeit: Fox wird nicht wissen, ob Sie die obige Textzeichenfolge eingeben, bis er versucht, sie auszuführen.
Dies ist auch für datengesteuerten Code nützlich: Sie können ganze Routinen in Memofeldern in der Datenbank speichern und sie dann einfach zur Laufzeit auswerten. Auf diese Weise können Sie einen Teil der Anwendung optimieren, ohne tatsächlich auf die Quelle zugreifen zu müssen. (Aber das ist insgesamt ein anderes Thema.)
quelle
Ich werde es Schritt für Schritt intuitiv in einfachen und lesbaren Python-Codes veranschaulichen.
Kurz gesagt, ein Lambda ist nur eine anonyme Inline-Funktion.
Beginnen wir mit der Aufgabe, um
lambdas
als Neuling mit Hintergrundwissen der Grundrechenarten zu verstehen .Die Blaupause der Zuweisung lautet "Name = Wert", siehe:
'x', 'y' sind Namen und 1, 'Wert' sind Werte. Versuchen Sie eine Funktion in Mathematik
Fehlerberichte,
Sie können eine Mathematik nicht direkt als Code schreiben, 'n' sollte definiert oder einem Wert zugewiesen werden.
Es funktioniert jetzt, was ist, wenn Sie darauf bestehen, die beiden getrennten Linien zu einer zu kombinieren. Da kommt
lambda
Es wurden keine Fehler gemeldet.
Dies ist ein Blick darauf
lambda
, es ermöglicht Ihnen, eine Funktion in einer einzigen Zeile wie in der Mathematik direkt in den Computer zu schreiben.Wir werden es später sehen.
Lassen Sie uns weiter tiefer in die 'Aufgabe' eintauchen.
Wie oben dargestellt,
=
funktioniert das Gleichheitszeichen für den Typ einfacher Daten (1 und 'Wert') und den einfachen Ausdruck (n ** 2 + 2 * n + 1).Versuche dies:
Es funktioniert für einfache Anweisungen, es gibt 11 Arten von ihnen in Python 7. Einfache Anweisungen - Python 3.6.3-Dokumentation
Wie wäre es mit einer zusammengesetzten Aussage?
Da kommt
def
es möglich zu funktionierenTada, analysiere es, 'm' ist der Name, 'n ** 2 + 2 * n + 1' ist der Wert.
:
ist eine Variante von '='.Finden Sie es, wenn nur zum Verständnis, alles beginnt mit der Zuweisung und alles ist Zuweisung.
Kehren
lambda
wir nun zu zurück , wir haben eine Funktion namens 'm'Versuchen:
Es gibt zwei Namen von 'm' hier, Funktion hat
m
bereits einen Namen, dupliziert.Es formatiert wie:
Es ist keine kluge Strategie, also Fehlerberichte
Wir müssen einen von ihnen löschen, eine Funktion ohne Namen setzen.
Es heißt "anonyme Funktion"
Abschließend,
lambda
in einer Inline-Funktion, mit der Sie eine Funktion wie in der Mathematik in einer geraden Linie schreiben könnenlambda
ist anonymHoffe das hilft.
quelle
Es ist eine Funktion, die keinen Namen hat. Zum Beispiel in c # können Sie verwenden
um die Zahlen zurückzugeben, die größer als 5 sind.
ist der Lambda-Teil hier. Es stellt eine Funktion dar, die einen Parameter (Zahl) annimmt und einen booleschen Wert (Zahl> 5) zurückgibt. Die GetMatchingItems-Methode verwendet dieses Lambda für alle Elemente in der Auflistung und gibt die übereinstimmenden Elemente zurück.
quelle
In Javascript, werden beispielsweise Funktionen wie der gleichen Mischtyp wie alles behandeln andere (
int
,string
,float
,bool
). Auf diese Weise können Sie Funktionen im laufenden Betrieb erstellen, sie Dingen zuweisen und sie später zurückrufen. Es ist nützlich, aber nicht etwas, das Sie übermäßig verwenden möchten, oder Sie werden jeden verwirren, der Ihren Code nach Ihnen pflegen muss ...Dies ist ein Code, mit dem ich gespielt habe, um zu sehen, wie tief dieses Kaninchenloch geht:
quelle
Im Kontext von CS ist eine Lambda-Funktion ein abstraktes mathematisches Konzept, das sich mit einem Problem der symbolischen Bewertung mathematischer Ausdrücke befasst. In diesem Zusammenhang ist eine Lambda-Funktion dieselbe wie ein Lambda-Term .
Aber in Programmiersprachen ist es etwas anderes. Es ist ein Code, der als "an Ort und Stelle" deklariert ist und als "erstklassiger Bürger" weitergegeben werden kann. Dieses Konzept schien nützlich zu sein, so dass es in fast allen gängigen modernen Programmiersprachen verfügbar war (siehe Lambda-Funktionen überall im Beitrag).
quelle
Mal sehen, wie Lambda (Closure) in Swift 4.2 mit der sorted () -Methode funktioniert - von der normalen Funktion bis zum kürzesten Ausdruck:
1. Normale Funktion
2. Abschlussausdruck
3. Inline-Abschlussausdruck
4. Typ aus dem Kontext ableiten
5. Implizite Rückgaben von Einzelausdrucksabschlüssen
6. Kurzargumentnamen
7. Operatormethoden
Hoffe das hilft.
quelle
Ich habe es auch. Ich habe es in JS mit diesem versucht:
Es addiert 2 zu 4 und multipliziert dann das Ergebnis mit 6. Allerdings fällt es mir manchmal schwer zu lesen :(
Außerdem habe ich für jede Funktion eine interessante gemacht:
forEach ([1,2,3,4,5]) (console.log);
Diese Methode iteriert ein Array und führt eine Aktion aus - im Fall des Druckens auf der Konsole. Jetzt verstehe auch ich, warum Labmdas mächtig sind.
quelle
In der Computerprogrammierung ist Lambda ein Code (Anweisung, Ausdruck oder eine Gruppe davon), der einige Argumente aus einer externen Quelle übernimmt. Es muss nicht immer eine anonyme Funktion sein - wir haben viele Möglichkeiten, sie zu implementieren.
Wir haben eine klare Trennung zwischen Ausdrücken, Aussagen und Funktionen, die Mathematiker nicht haben.
Das Wort "Funktion" in der Programmierung ist auch anders - wir haben "Funktion ist eine Reihe von Schritten zu tun" (aus dem Lateinischen "durchführen"). In der Mathematik geht es um die Korrelation zwischen Variablen.
Funktionale Sprachen versuchen, mathematischen Formeln so ähnlich wie möglich zu sein, und ihre Wörter bedeuten fast dasselbe. Aber in anderen Programmiersprachen haben wir es anders.
quelle
Die Frage wurde vollständig beantwortet, ich möchte nicht auf Details eingehen. Ich möchte die Verwendung beim Schreiben numerischer Berechnungen in Rost teilen.
Es gibt ein Beispiel für ein Lambda (anonyme Funktion)
Als ich ein Modul der Newton-Raphson-Methode schrieb, wurde es als Ableitung erster und zweiter Ordnung verwendet. (Wenn Sie wissen möchten, was die Newton-Raphson-Methode ist, besuchen Sie bitte " https://en.wikipedia.org/wiki/Newton%27s_method ".
Die Ausgabe wie folgt
quelle
Stellen Sie sich vor, Sie haben ein Restaurant mit Lieferoption und eine Bestellung, die in weniger als 30 Minuten erledigt werden muss. Der Punkt ist, dass es Kunden normalerweise egal ist, ob Sie ihr Essen mit dem Fahrrad mit dem Auto oder barfuß schicken, solange Sie das Essen warm und gefesselt halten. Lassen Sie uns diese Redewendung mit anonymen und definierten Transportfunktionen in Javascript konvertieren.
Im Folgenden haben wir die Art und Weise unserer Lieferung definiert, auch bekannt als Name für eine Funktion:
Was wäre, wenn wir Pfeil- / Lambda-Funktionen verwenden würden, um diese Übertragung durchzuführen:
Sie sehen, es gibt keinen Unterschied für den Kunden und keine Zeitverschwendung, darüber nachzudenken, wie man Lebensmittel verschickt. Schick es einfach.
Übrigens empfehle ich den Kebap mit Cola nicht. Deshalb geben Ihnen die oberen Codes Fehler. Habe Spaß.
quelle