Ich bin ein bisschen verwirrt über "Funktion" und "Lambda". Ich habe einige Beispiele gesehen, die zeigen, dass das Schema-Schlüsselwort lambda
dem JavaScript-Schlüsselwort sehr ähnlich ist function
, aber ich weiß wirklich nicht, wie sie zusammenhängen.
Mir wurde gesagt, dass 'function' und 'method' synonym verwendet werden können, wenn über Objekte in .net gesprochen wird. Ich frage mich, ob 'Lambda' und 'Funktion' dasselbe bedeuten. Ich frage mich, ob 'Lambda' eine esoterische Bedeutung hat, da der griechische Buchstabe Lambda (λ) in so vielen Avataren auf dieser Seite vorkommt. Um die Dinge in .net noch verwirrender zu machen, verweisen die funktionalen Teile von C # auf Funktionsausdrücke, die als 'Lambda-Ausdrücke' an eine andere Funktion übergeben wurden, sodass das Wort tatsächlich überall vorkommt.
Ich bin auch vage mit dem Begriff "Lambda-Kalkül" vertraut.
Was ist der Unterschied zwischen einer Funktion und einem Lambda?
quelle
I wonder if 'lambda' has some esoteric meaning, seeing that the Greek letter lambda (λ) appears in so many avatars on this site.
Man würde hoffen, dass es in Bezug auf Lambda-Kalkül sein würde, aber ich habe ein seltsames Gefühl, dass Half Life für Lambda-Avatare verantwortlich ist.Antworten:
Das Wort "Lambda" oder "Lambda-Ausdrücke" bezieht sich meist auf anonyme Funktionen. In diesem Sinne ist ein Lambda eine Art von Funktion, aber nicht jede Funktion ist ein Lambda (dh benannte Funktionen werden normalerweise nicht als Lambdas bezeichnet). Abhängig von der Sprache werden anonyme Funktionen häufig anders implementiert als benannte Funktionen (insbesondere in Sprachen, in denen anonyme Funktionen abgeschlossen sind und benannte Funktionen nicht). Daher kann es sinnvoll sein, sie mit unterschiedlichen Begriffen zu bezeichnen.
Der Unterschied zwischen dem Lambda-Schlüsselwort des Schemas und dem Funktionsschlüsselwort von Javascript besteht darin, dass das letztere verwendet werden kann, um sowohl anonyme Funktionen als auch benannte Funktionen zu erstellen, während das erstere nur anonyme Funktionen erstellt (und Sie
define
zum Erstellen benannter Funktionen verwenden würden).Der Lambda-Kalkül ist eine minimale Programmiersprache / ein mathematisches Rechenmodell, das Funktionen als einzige "Datenstruktur" verwendet. Im Lamdba-Kalkül werden mit dem Lambda-Symbol (anonyme) Funktionen erzeugt. Daher kommt die Verwendung des Begriffs "Lambda" in anderen Sprachen.
quelle
define
(oderlet
einen seiner Verwandten oder eine interne Definition), um Namen zu erstellen - das ist alles. Indefine
Bezug auf Funktionen gibt es nichts Besonderes .define
es gibt eine spezielle Form zum Definieren von Funktionen (dh Sie können schreiben(define (f x) (foo))
statt(define f (lambda (x) (foo)))
), aber mein Punkt war, dass Sie eine benannte Funktion nichtlambda
alleine erstellen können, dh Sie können nicht so etwas wie(lambda f (x) (foo))
das Definieren einer benannten Funktion schreibenf
Das erfordert ein Argument, wie Sie es mit demfunction
Schlüsselwort von Javascript können .define
hat das als syntaktischen Zucker, also ist es nicht so wichtig wie seine Rolle als Werkzeug zur Namensbindung für alle Werte. Eslambda
ist ein wichtiges Merkmal, keinen Namen für sich selbst zu erstellen, da es das Geben von Namen von Funktionsformen trennt ... IMO JS tut das Richtige, um die Trennung zuzulassen und gleichzeitig einen optionalen Namen für die Massen zu akzeptieren, die entsetzt wären die Idee einer Funktion ohne Namen. (Und zum Glück ist die Größe dieser Massen in einem allgemeinen Rückgang ...)Ein Lambda ist einfach eine anonyme Funktion - eine Funktion ohne Namen.
quelle
lambda
Ausdruck in Schema ist wie einfunction
Ausdruck ohne Namen - aber nichts hindert Sie daran, ihnen später einen Namen zu geben. Zum Beispielvar f = [function(x){return x;}][0]
. Man könnte argumentieren, dass der Funktionswert selbst keinen Namen hat, aber das würde für alle Funktionen zutreffen ...Beantwortet hier: https://stackoverflow.com/questions/16501/what-is-a-lambda-function
Grundsätzlich ist Lambda eine anonyme Funktion.
quelle
In C # ist die Funktion Anonymous ein allgemeiner Begriff, der sowohl Lambda-Ausdrücke als auch anonyme Methoden enthält (anonyme Methoden sind Delegate-Instanzen ohne tatsächliche Methodendeklaration).
Lambda-Ausdrücke können in die Ausdrücke Lambda und Statement Lambda zerlegt werden
Ausdruck Lambda:
Die Anweisung lambda ähnelt dem Ausdruck lambda, mit der Ausnahme, dass die Anweisung (en) in geschweifte Klammern eingeschlossen sind:
Wenn wir über Lambda-Ausdrücke in JavaScript sprechen, bedeutet das im Grunde nur, eine Funktion als Argument in einem Aufruf einer anderen Funktion zu verwenden.
quelle
TL; DR Wie andere betonten: Die Lambda-Notation ist nur eine Möglichkeit, Funktionen zu definieren, ohne gezwungen zu sein, ihnen einen Namen zu geben.
Lange Version
Ich würde gerne ein bisschen auf dieses Thema eingehen, weil ich es sehr interessant finde. Haftungsausschluss: Ich habe vor langer Zeit meinen Kurs über Lambda-Kalkül belegt. Wenn jemand mit besseren Kenntnissen Ungenauigkeiten in meiner Antwort findet, kann er mir gerne helfen, diese zu verbessern.
Beginnen wir mit Ausdrücken, zB
1 + 2
undx + 2
. Literale wie1
und2
werden Konstanten genannt, weil sie an bestimmte feste Werte gebunden sind.Ein Bezeichner wie
x
" Variable" muss zuerst an einen Wert gebunden werden, um ihn auszuwerten. Sie können also grundsätzlich nicht bewertenx + 1
, solange Sie nicht wissen, wasx
ist.Die Lambda-Notation bietet ein Schema zum Binden bestimmter Eingabewerte an Variablen. Ein Lambda-Ausdruck kann gebildet werden, indem
λx .
vor einem existierenden Ausdruck hinzugefügt wird , zλx . x + 1
. Variablex
wird gesagt, dass frei inx + 1
und gebunden inλx . x + 1
Wie hilft dies bei der Auswertung von Ausdrücken? Wenn Sie dem Lambda-Ausdruck einen Wert hinzufügen, wie folgt
Dann können Sie den gesamten Ausdruck auswerten, indem Sie alle Vorkommen der Variablen
x
durch den Wert 2 ersetzen (binden) :Die Lambda-Notation bietet also einen allgemeinen Mechanismus, um Dinge an Variablen zu binden, die in einem Ausdrucks- / Programmblock vorkommen. Je nach Kontext entstehen so in den Programmiersprachen sehr unterschiedliche Konzepte:
Abgesehen von den Unterschieden geht es bei der Lambda-Notation darum, formale Parameter zu definieren und an tatsächliche Parameter zu binden.
Der nächste Schritt besteht darin, einer Funktion / Prozedur einen Namen zu geben. In mehreren Sprachen sind Funktionen Werte wie alle anderen, sodass Sie einer Funktion wie folgt einen Namen geben können:
Wie Eli Barzilay betonte, binden diese Definitionen den Namen nur
f
an einen Wert, der zufällig eine Funktion ist. In dieser Hinsicht sind Funktionen, Zahlen, Zeichenfolgen und Zeichen alle Werte, die auf die gleiche Weise an Namen gebunden werden können:In diesen Sprachen können Sie eine Funktion auch unter Verwendung der bekannteren (aber äquivalenten) Notation an einen Namen binden:
Einige Sprachen, z. B. C, unterstützen nur die letztere Notation zum Definieren von (benannten) Funktionen.
Verschlüsse
Einige abschließende Bemerkungen zu Schließungen . Betrachten Sie den Ausdruck
x + y
. Dieser enthält zwei freie Variablen. Wenn Siex
mit der Lambda-Notation binden , erhalten Sie:Dies ist (noch) keine Funktion, da sie noch eine freie Variable enthält
y
. Sie könnten auch eine Funktion daraus machen, indem Sie Folgendes bindeny
:oder
Das ist genau das gleiche wie die
+
Funktion.Aber Sie können zum Beispiel
y
auf andere Weise binden (*):Das Ergebnis der Anwendung von FunktionsinkrementBy auf eine Zahl ist ein Abschluss, dh eine Funktion / Prozedur, deren Hauptteil eine freie Variable (z. B.
y
) enthält, die an einen Wert aus der Umgebung gebunden wurde, in der der Abschluss definiert wurde.Ebenso
incrementBy 5
die Funktion (Closure), die die Zahlen um 5 erhöht.HINWEIS (*)
Ich betrüge hier ein bisschen:
ist äquivalent zu
Der Bindemechanismus ist also derselbe. Intuitiv stelle ich mir einen Verschluss als Teil eines komplexeren Lambda-Ausdrucks vor. Wenn diese Repräsentation erstellt wird, wurden einige der Bindungen des Mutterausdrucks bereits festgelegt und der Abschluss verwendet sie später, wenn sie ausgewertet / aufgerufen wird.
quelle
"Lambda" in der Programmierung bedeutet üblicherweise "Lambda-Funktion" (oder auch "Lambda-Ausdruck", "Lambda-Term"). Wenn function ein benannter Codeblock ist, der vor seiner Verwendung definiert wurde, ist "lambda function" ein Codeblock (oder ein Ausdruck), der anstelle der Verwendung definiert wurde und als erstklassiger Bürger in einer Programmiersprache verwendet werden kann.
In JavaScript ES6 (2015) gibt es eine kurze Syntax zum Definieren von Lambdas mit der Bezeichnung "Pfeilfunktionen" . In C # wurde eine solche Syntax in .NET 3.0 eingeführt (um 2006) .
In der Mathematik hat ein "Funktions" -Begriff mehrere Bedeutungen, wobei sich eine der Bedeutungen auf die Notation einer Funktion bezieht (dh wie man sie aufschreibt), dann ist "Lambda-Funktion" (im Kalkül) eine spezielle Art von Funktionsnotation. Weitere Informationen finden Sie unter Lambda-Funktionen in Programmiersprachen .
quelle