applicazione funzione parziale è circa fissa alcuni argomenti di una data funzione per produrre un'altra funzione con meno argomenti, come
sum = lambda x, y: x + y
inc = lambda x: sum(x, 1)
noti che 'inc' è 'somma' parzialmente applicato, senza catturare nulla dal il contesto (come hai detto la chiusura).
Ma tali funzioni scritte a mano (di solito anonime) sono un po 'noiose. Si può usare una fabbrica di funzioni, che restituisce una funzione interna. La funzione interna può essere parametrizzato catturando qualche variabile dal suo contesto, come
# sum = lambda x, y: x + y
def makePartialSumF(n):
def partialSumF(x):
return sum(x, n)
return partialSumF
inc = makePartialSumF(1)
plusTwo = makePartialSumF(2)
Ecco la fabbrica makePartialSumF viene richiamato due volte. Ogni chiamata ha come risultato una funzione parzialeSumF (acquisizione di valori diversi come n). L'uso della chiusura rende conveniente l'implementazione dell'applicazione parziale. Quindi puoi dire che l'applicazione parziale può essere implementata tramite la chiusura. Ovviamente le chiusure possono fare molte altre cose! (Come nodo laterale, pitone non ha corretta chiusura.)
Currying è di trasformare una funzione di N argomenti in una funzione unaria che restituisce una funzione unaria ... per esempio abbiamo una funzione che prende tre argomenti e restituisce un valore:
sum = lambda x, y, z: x + y + z
La versione al curry è
curriedSum = lambda x: lambda y: lambda z: x + y + z
Scommetto che non sarebbe scrivere codice python così. IMO la motivazione di Currying è per lo più di interesse teorico. (Una struttura per esprimere calcoli usando solo funzioni unarie: ogni funzione è unaria!) Il sottoprodotto pratico è che, nelle lingue in cui le funzioni sono curate, alcune applicazioni parziali (quando si "aggiustano" argomenti da sinistra) sono banali come fornendo argomenti alla funzione curry. (Ma non tutte le applicazioni parziali sono come tali Esempio: dato f (x, y, z) = x + 2 * y + 3 * z, quando si lega y a una costante per ottenere una funzione di due variabili.) Quindi tu Può dire, Currying è una tecnica che, in pratica e come sottoprodotto, può rendere banali molte utili applicazioni parziali funzionali, ma non è questo il punto di Currying.
Ho provato a chiarire le cose leggendo molte cose sull'argomento: c'è molta confusione tra curry e applicazioni parziali, che sono comunemente scambiate ma sono cose diverse. Wikipedia dice: "l'applicazione parziale (o l'applicazione di una funzione parziale) si riferisce al processo di fissare un numero di argomenti a una funzione, producendo un'altra funzione di arità più piccola" – Cancer
Che è esattamente ciò che sta accadendo sopra. Per quanto ne so, il curry è solo un'espressione particolare della forma. – Hamish
Sì, capisco, il tuo codice lo fa, ed è abbastanza chiaro. Ma ... non lo faccio anche io? Diversamente, è ovvio, non sto passando funzioni come parametri, ma sto correggendo anche un argomento e creando una funzione con arità più piccola che fa la stessa cosa e restituisce lo stesso valore come se avessi chiamato la funzione originale con tutti i parametri . Scusate, mi sento piuttosto stupido, sono perplesso ... – Cancer