Qual è la differenza tra una funzione e una lambda?

52

Sono un po 'confuso riguardo a "function" e "lambda". Ho visto alcuni esempi che mostrano che la parola chiave dello schema lambda funziona in modo molto simile alla parola chiave JavaScript function , ma in realtà non so come siano correlati.

Mi è stato detto che "funzione" e "metodo" possono essere usati in modo intercambiabile quando si parla di oggetti in .net. Mi chiedo se "lambda" e "funzione" significano allo stesso modo la stessa cosa. Mi chiedo se 'lambda' abbia qualche significato esoterico, visto che la lettera greca lambda (λ) appare in così tanti avatar su questo sito. Per rendere le cose ancora più confuse, in .net, le parti funzionali di C # si riferiscono a espressioni di funzioni passate a un'altra funzione come 'espressioni lambda', quindi la parola sembra davvero essere dappertutto.

Ho anche vagamente familiarità con il termine "calcolo lambda".

Qual è la differenza tra una funzione e una lambda?

    
posta Rice Flour Cookies 18.01.2012 - 17:33
fonte

6 risposte

42

La parola "lambda" o "espressioni lambda" si riferisce molto spesso a funzioni anonime. Quindi in questo senso un lambda è un tipo di funzione, ma non tutte le funzioni sono lambda (ad esempio, le funzioni con nome non vengono generalmente chiamate lambda). A seconda della lingua, le funzioni anonime vengono spesso implementate in modo diverso rispetto alle funzioni con nome (in particolare nelle lingue in cui le funzioni anonime sono chiusure e le funzioni con nome non lo sono), quindi fare riferimento ad esse con termini diversi può avere senso.

La differenza tra la parola chiave lambda dello schema e la parola chiave function di Javascript è che quest'ultimo può essere utilizzato per creare sia funzioni anonime sia funzioni con nome mentre il primo crea solo funzioni anonime (e si usa define per creare funzioni con nome).

Il lambda calcolo è un linguaggio di programmazione minimale / modello matematico di computazione, che usa le funzioni come unica "struttura dati". Nel calcolo lamdba il simbolo lambda viene utilizzato per creare funzioni (anonime). Qui è dove viene l'uso del termine "lambda" in altre lingue.

    
risposta data 18.01.2012 - 17:52
fonte
17

Un lambda è semplicemente una funzione anonima, una funzione senza nome.

    
risposta data 18.01.2012 - 17:51
fonte
9

Risposta: link

Fondamentalmente Lambda è una funzione anonima.

    
risposta data 18.01.2012 - 17:51
fonte
7

In C # La funzione anonima è un termine generale che include sia espressioni lambda che metodi anonimi (i metodi anonimi sono istanze delegate senza una dichiarazione effettiva del metodo).

Le espressioni lambda possono essere suddivise in espressione lambda e istruzione lambda

Espressione lambda:

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

L'istruzione lambda è simile all'espressione lambda tranne che le istruzioni sono racchiuse tra parentesi:

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

Quando parliamo di espressioni lambda in JavaScript, in pratica, significa semplicemente utilizzare una funzione come argomento in una chiamata a un'altra funzione.

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
    
risposta data 19.01.2012 - 01:03
fonte
4

TL; DR Come altri hanno sottolineato: la notazione lambda è solo un modo per definire le funzioni senza essere costretti a dare loro un nome.

Versione lunga

Vorrei approfondire un po 'questo argomento perché lo trovo molto interessante. Disclaimer: ho seguito il mio corso sul calcolo lambda molto tempo fa. Se qualcuno con una conoscenza migliore trova inesattezze nella mia risposta, sentiti libero di aiutarmi a migliorarlo.

Iniziamo con le espressioni, ad es. 1 + 2 e x + 2 . I valori letterali come 1 e 2 sono chiamati costanti perché sono associati a valori fissi specifici.

Un identificatore come x è chiamato variable e per valutarlo devi prima associarlo a qualche valore. Quindi, in sostanza, non puoi valutare x + 1 se non sai cos'è x .

La notazione lambda fornisce uno schema per legare valori di input specifici alle variabili. Un'espressione lambda può essere formata aggiungendo λx . davanti a un'espressione esistente, ad es. %codice%. Si dice che la variabile λx . x + 1 sia libera in x e associata in x + 1

In che modo questo aiuta a valutare le espressioni? Se si alimenta un valore per l'espressione lambda, in questo modo

(λx . x + 1) 2

quindi puoi valutare l'intera espressione sostituendo (vincolando) tutte le occorrenze della variabile λx . x + 1 con il valore 2:

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

Quindi, la notazione lambda fornisce un meccanismo generale per legare le cose alle variabili che appaiono in un blocco espressione / programma. A seconda del contesto, ciò crea visivamente diversi concetti nei linguaggi di programmazione:

  • In un linguaggio puramente funzionale come Haskell, le espressioni lambda rappresentano funzioni in senso matematico: un valore di input viene iniettato nel corpo della lambda e viene prodotto un valore di output.
  • In molte lingue (ad es. JavaScript, Python, Scheme) la valutazione del corpo di un'espressione lambda può avere effetti collaterali. In questo caso si può usare il termine procedura per contrassegnare la differenza rispetto alle funzioni pure.

Oltre alle differenze, la notazione lambda riguarda la definizione di parametri formali e il loro vincolo ai parametri attuali.

Il prossimo passo, è dare un nome / una funzione / procedura. In diverse lingue, le funzioni sono valori come qualsiasi altro, quindi puoi assegnare un nome a una funzione come segue:

(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

Come sottolineato da Eli Barzilay, queste definizioni legano il nome x a un valore, che sembra essere una funzione. Quindi sotto questo aspetto, funzioni, numeri, stringhe, caratteri sono tutti valori che possono essere associati ai nomi nello stesso modo:

(define n 42)   ;; Scheme

n = 42          -- Haskell

val n: Int = 42 // Scala

var n = 42      // JavaScript

n = 42          # Python

In queste lingue puoi anche associare una funzione a un nome usando la notazione più familiare (ma equivalente):

(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

Alcune lingue, ad es. C, supporta solo la seconda notazione per la definizione delle funzioni (denominate).

Chiusure

Alcune osservazioni finali riguardanti chiusure . Considera l'espressione f . Questo contiene due variabili libere. Se si associa x + y usando la notazione lambda si ottiene:

\x -> x + y

Questa non è (ancora) una funzione perché contiene ancora una variabile libera x . Puoi creare una funzione anche vincolando y :

\x -> \y -> x + y

o

\x y -> x + y

che equivale alla funzione y .

Ma puoi vincolare, ad esempio, + in un altro modo (*):

incrementBy y = \x -> x + y

Il risultato dell'applicazione della funzione incrementBy a un numero è una chiusura, ovvero una funzione / procedura il cui corpo contiene una variabile libera (ad esempio y ) che è stata associata a un valore dall'ambiente in cui è stata definita la chiusura.

Quindi y è la funzione (chiusura) che incrementa i numeri per 5.

NOTA (*)

Sto barando un po 'qui:

incrementBy y = \x -> x + y

è equivalente a

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

quindi il meccanismo di associazione è lo stesso. Intuitivamente, penso a una chiusura che rappresenti un frammento di un'espressione lambda più complessa. Quando viene creata questa rappresentazione, alcuni dei collegamenti dell'espressione madre sono già stati impostati e la chiusura li utilizza in seguito quando viene valutato / invocato.

    
risposta data 16.10.2015 - 23:17
fonte
0

"Lambda" nella programmazione di solito significa "funzione lambda" (o anche "espressione lambda", "termine lambda"). Quando function è un blocco denominato di codice definito prima del suo utilizzo, "funzione lambda" è un blocco di codice (o un'espressione) definito al posto dell'uso che può essere utilizzato come cittadino di prima classe in un linguaggio di programmazione.

In JavaScript ES6 (2015) c'è una breve sintassi per definire lambda chiamata "Funzioni freccia" . In C # tale sintassi è stato introdotto in .NET 3.0 (circa 2006) .

In matematica una nozione di "funzione" ha diversi significati in cui uno dei significati riguarda la notazione di una funzione (cioè come scriverla), quindi la "funzione lambda" (nel calcolo) è un tipo speciale di notazione di funzione. Per ulteriori discussioni, consulta le funzioni lambda nei linguaggi di programmazione .

    
risposta data 21.08.2016 - 12:42
fonte

Leggi altre domande sui tag