Mein begrenztes Verständnis ist wie folgt:
1) Teilfunktionsanwendung
Partial Function Application ist das Zurückgeben einer Funktion mit einer geringeren Anzahl von Argumenten. Wenn Sie 2 von 3 Argumenten angeben, wird eine Funktion mit 3-2 = 1 Argument zurückgegeben. Wenn Sie 1 von 3 Argumenten angeben, wird eine Funktion zurückgegeben, die 3-1 = 2 Argumente akzeptiert. Wenn Sie möchten, können Sie sogar 3 von 3 Argumenten teilweise anwenden und es wird eine Funktion zurückgegeben, die kein Argument akzeptiert.
Also gegeben die folgende Funktion:
f(x,y,z) = x + y + z;
Wenn Sie 1 an x binden und dies teilweise auf die obige Funktion anwenden, f(x,y,z)
erhalten Sie:
f(1,y,z) = f'(y,z);
Wo: f'(y,z) = 1 + y + z;
Wenn Sie nun y an 2 und z an 3 binden und teilweise anwenden, erhalten f'(y,z)
Sie:
f'(2,3) = f''();
Wo: f''() = 1 + 2 + 3
;
Jetzt können Sie jederzeit auswählen, ob oder ausgewertet werden f
soll . Also kann ich tun:f'
f''
print(f''()) // and it would return 6;
oder
print(f'(1,1)) // and it would return 3;
2) Currying
Currying auf der anderen Seite ist das Verfahren , eine Funktion in einer verschachtelten Kette von einem Argument Funktionen aufzuteilen. Sie können niemals mehr als ein Argument angeben, es ist eins oder null.
Also gegeben die gleiche Funktion:
f(x,y,z) = x + y + z;
Wenn Sie es curryen, würden Sie eine Kette von 3 Funktionen erhalten:
f'(x) -> f''(y) -> f'''(z)
Wo:
f'(x) = x + f''(y);
f''(y) = y + f'''(z);
f'''(z) = z;
Wenn Sie jetzt anrufen f'(x)
mit x = 1
:
f'(1) = 1 + f''(y);
Sie erhalten eine neue Funktion zurück:
g(y) = 1 + f''(y);
Wenn Sie anrufen g(y)
mit y = 2
:
g(2) = 1 + 2 + f'''(z);
Sie erhalten eine neue Funktion zurück:
h(z) = 1 + 2 + f'''(z);
Zum Schluss, wenn Sie anrufen h(z)
mit z = 3
:
h(3) = 1 + 2 + 3;
Sie werden zurückgebracht 6
.
3) Schließung
Schließlich ist Closure der Vorgang, bei dem eine Funktion und Daten als eine Einheit erfasst werden. Ein Funktionsabschluss kann 0 bis unendlich viele Argumente annehmen, berücksichtigt jedoch auch Daten, die nicht an ihn übergeben wurden.
Wieder mit der gleichen Funktion:
f(x,y,z) = x + y + z;
Sie können stattdessen einen Abschluss schreiben:
f(x) = x + f'(y, z);
Wo:
f'(y,z) = x + y + z;
f'
wird geschlossen x
. Das bedeutet, dass f'
der Wert von x gelesen werden kann, der sich darin befindet f
.
Also, wenn Sie anrufen würden f
mit x = 1
:
f(1) = 1 + f'(y, z);
Sie würden eine Schließung bekommen:
closureOfF(y, z) =
var x = 1;
f'(y, z);
Wenn Sie jetzt closureOfF
mit y = 2
und angerufen haben z = 3
:
closureOfF(2, 3) =
var x = 1;
x + 2 + 3;
Welches würde zurückkehren 6
Fazit
Currying, Teilapplikation und Verschlüsse ähneln sich insofern, als sie eine Funktion in mehrere Teile zerlegen.
Durch das Ausführen wird eine Funktion mehrerer Argumente in verschachtelte Funktionen einzelner Argumente zerlegt, die Funktionen einzelner Argumente zurückgeben. Es hat keinen Sinn, eine Funktion mit einem oder weniger Argumenten aufzurufen, da dies keinen Sinn ergibt.
Partielle Anwendung zerlegt eine Funktion mehrerer Argumente in eine Funktion kleinerer Argumente, deren jetzt fehlende Argumente den angegebenen Wert ersetzt haben.
Closure zerlegt eine Funktion in eine Funktion und ein Dataset, wobei Variablen innerhalb der Funktion, die nicht übergeben wurden, in das Dataset schauen können, um einen Wert zu finden, an den sie gebunden werden können, wenn sie zur Auswertung aufgefordert werden.
Was an all diesen verwirrend ist, ist, dass sie verwendet werden können, um eine Teilmenge der anderen zu implementieren. Im Grunde sind sie alle ein kleines Implementierungsdetail. Sie alle bieten einen ähnlichen Wert, da Sie nicht alle Werte im Voraus erfassen müssen und einen Teil der Funktion wiederverwenden können, da Sie sie in diskrete Einheiten zerlegt haben.
Offenlegung
Ich bin auf keinen Fall ein Experte des Themas, ich habe erst vor kurzem angefangen, darüber zu lernen, und daher gebe ich mein derzeitiges Verständnis wieder, aber es könnte Fehler geben, auf die ich Sie hinweisen möchte, und ich werde korrigieren als / ob Ich entdecke keine.