it-swarm.com.de

Was ist der Unterschied zwischen einer Funktion und einem Lambda?

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 function sehr ähnlich funktioniert, aber ich weiß wirklich nicht, wie sie zusammenhängen.

Mir wurde gesagt, dass 'Funktion' und 'Methode' austauschbar 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 Site vorkommt. Um die Sache noch verwirrender zu machen, beziehen sich die Funktionsteile von C # in .net auf Funktionsausdrücke, die an eine andere Funktion übergeben wurden, als 'Lambda-Ausdrücke', sodass das Wort wirklich überall zu sein scheint.

Ich bin auch vage mit dem Begriff "Lambda-Kalkül" vertraut.

Was ist der Unterschied zwischen einer Funktion und einem Lambda?

54

Das Wort "Lambda" oder "Lambda-Ausdrücke" bezieht sich am häufigsten auf anonyme Funktionen. In diesem Sinne ist ein Lambda eine Art Funktion, aber nicht jede Funktion ist ein Lambda (d. H. 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 geschlossen sind und benannte Funktionen nicht). Daher kann es sinnvoll sein, auf sie mit unterschiedlichen Begriffen zu verweisen.

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 würden define verwenden, um benannte Funktionen zu erstellen).

Der Lambda-Kalkül ist eine minimale Programmiersprache/ein mathematisches Berechnungsmodell, das Funktionen als einzige "Datenstruktur" verwendet. In der Lamdba-Rechnung wird das Lambda-Symbol verwendet, um (anonyme) Funktionen zu erstellen. Daher kommt die Verwendung des Begriffs "Lambda" in anderen Sprachen.

44
sepp2k

Ein Lambda ist einfach eine anonyme Funktion - eine Funktion ohne Namen.

19
Oded

Hier beantwortet: https://stackoverflow.com/questions/16501/what-is-a-lambda-function

Grundsätzlich ist Lambda eine anonyme Funktion.

9
TWith2Sugars

In C # Anonyme Funktion ist ein allgemeiner Begriff, der sowohl Lambda-Ausdrücke als auch anonyme Methoden enthält (anonyme Methoden sind delegierte Instanzen ohne tatsächliche Methodendeklaration).

Lambda-Ausdrücke kann in Ausdruck Lambda und Anweisung Lambda zerlegt werden

Ausdruck Lambda:

(int x, string y) => x == y.Length 

Die Anweisung lambda ähnelt dem Ausdruck lambda, außer dass die Anweisung (en) in geschweiften Klammern stehen:

(int x, string y) => {
         if (x == y.Length) {
             Console.WriteLine(y);
         }
}

Wenn wir über Lambda-Ausdrücke in JavaScript sprechen, bedeutet dies im Grunde nur, eine Funktion als Argument in einem Aufruf einer anderen Funktion zu verwenden.

var calculate = function(x, y, operation){
    return operation(x, y);
}

// we're passing anonymous function as a third argument
calculate(10, 15, function(x, y) {
    return x + y;
}); // 25
8
Christian P

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.

Langfassung

Ich möchte auf dieses Thema etwas näher 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, können Sie mir gerne helfen, diese zu verbessern.

Beginnen wir mit Ausdrücken, z. 1 + 2 Und x + 2. Literale wie 1 Und 2 Werden Konstanten genannt, weil sie an bestimmte feste Werte gebunden sind.

Ein Bezeichner wie x heißt Variable, und um ihn auszuwerten, müssen Sie ihn zuerst an einen Wert binden. Grundsätzlich können Sie x + 1 Nicht auswerten, solange Sie nicht wissen, was x ist.

Die Lambda-Notation bietet ein Schema zum Binden bestimmter Eingabewerte an Variablen. Ein Lambda-Ausdruck kann gebildet werden, indem λx . Vor einem vorhandenen Ausdruck hinzugefügt wird, z. λx . x + 1. Die Variable x soll frei in x + 1 Und gebunden in λx . x + 1 Sein.

Wie hilft dies bei der Bewertung von Ausdrücken? Wenn Sie dem Lambda-Ausdruck einen Wert geben, wie folgt

(λx . x + 1) 2

dann können Sie den gesamten Ausdruck auswerten, indem Sie alle Vorkommen der Variablen x durch den Wert 2 ersetzen (binden):

(λx . x + 1) 2
      2 + 1
      3

Die Lambda-Notation bietet also einen allgemeinen Mechanismus zum Binden von Dingen an Variablen, die in einem Ausdrucks-/Programmblock erscheinen. Dies führt je nach Kontext zu deutlich unterschiedlichen Konzepten in Programmiersprachen:

  • In einer rein funktionalen Sprache wie Haskell repräsentieren Lambda-Ausdrücke Funktionen im mathematischen Sinne: Ein Eingabewert wird in den Körper des Lambda injiziert und ein Ausgabewert wird erzeugt.
  • In vielen Sprachen (z. B. JavaScript, Python, Schema) kann die Bewertung des Körpers eines Lambda-Ausdrucks Nebenwirkungen haben. In diesem Fall kann man den Begriff Prozedur verwenden, um den Unterschied zwischen reinen Funktionen zu markieren.

Abgesehen von den Unterschieden geht es bei der Lambda-Notation darum, formale Parameter zu definieren und sie 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:

(define f (lambda (x) (+ x 1)))      ;; Scheme

f = \x -> x + 1                      -- Haskell

val f: (Int => Int) = x => x + 1     // Scala

var f = function(x) { return x + 1 } // JavaScript

f = lambda x: x + 1                  # Python

Wie Eli Barzilay betonte, binden diese Definitionen nur den Namen f an einen Wert, der zufällig eine Funktion ist. In dieser Hinsicht sind Funktionen, Zahlen, Zeichenfolgen und Zeichen alle Werte, die auf dieselbe Weise an Namen gebunden werden können:

(define n 42)   ;; Scheme

n = 42          -- Haskell

val n: Int = 42 // Scala

var n = 42      // JavaScript

n = 42          # Python

In diesen Sprachen können Sie eine Funktion auch mit der bekannteren (aber äquivalenten) Notation an einen Namen binden:

(define (f x) (+ x 1))         ;; Scheme

f x = x + 1                    -- Haskell

def f(x: Int): Int = x + 1     // Scala

function f(x) { return x + 1 } // JavaScript

def f(x): return x + 1         # Python

Einige Sprachen, z. C, unterstützen Sie nur die letztere Notation zum Definieren (benannter) Funktionen.

Verschlüsse

Einige abschließende Bemerkungen zu Schließungen. Betrachten Sie den Ausdruck x + y. Dies enthält zwei freie Variablen. Wenn Sie x mit der Lambda-Notation binden, erhalten Sie:

\x -> x + y

Dies ist (noch) keine Funktion, da sie noch eine freie Variable y enthält. Sie können eine Funktion daraus machen, indem Sie auch y binden:

\x -> \y -> x + y

oder

\x y -> x + y

dies entspricht genau der Funktion +.

Aber Sie können beispielsweise y auf andere Weise binden (*):

incrementBy y = \x -> x + y

Das Ergebnis der Anwendung des Funktionsinkrements By auf eine Zahl ist ein Abschluss, d. H. Eine Funktion/Prozedur, deren Körper eine freie Variable (z. B. y) enthält, die an einen Wert aus der Umgebung gebunden wurde, in der der Abschluss definiert wurde.

incrementBy 5 Ist also die Funktion (Schließung), die Zahlen um 5 erhöht.

HINWEIS (*)

Ich betrüge hier ein bisschen:

incrementBy y = \x -> x + y

ist äquivalent zu

incrementBy = \y -> \x -> x + y

der Bindungsmechanismus ist also der gleiche. Intuitiv stelle ich mir einen Verschluss als Teil eines komplexeren Lambda-Ausdrucks vor. Wenn diese Darstellung erstellt wird, wurden einige der Bindungen des Mutterausdrucks bereits festgelegt, und der Abschluss verwendet sie später, wenn er ausgewertet/aufgerufen wird.

4
Giorgio

"Lambda" bedeutet in der Programmierung normalerweise "Lambda-Funktion" (oder auch "Lambda-Ausdruck", "Lambda-Term"). Wenn function ein benannter Codeblock ist, der vor seiner Verwendung definiert wurde, ist "Lambda-Funktion" 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 dem Namen "Pfeilfunktionen" . In C # solche Syntax wurde in .NET 3.0 (um 2006) eingeführt .

In der Mathematik hat ein "Funktions" -Begriff mehrere Bedeutungen, wobei eine der Bedeutungen die Notation einer Funktion betrifft (d. H. Wie man sie aufschreibt), dann ist die "Lambda-Funktion" (im Kalkül) eine spezielle Art der Funktionsnotation. Weitere Informationen finden Sie unter Lambda-Funktionen in Programmiersprachen .

0
battlmonstr