Ist „Partial Funktion Anwendung“ eine falsche Bezeichnung im Zusammenhang mit Javascript?

StackOverflow https://stackoverflow.com/questions/92984

  •  01-07-2019
  •  | 
  •  

Frage

Ein Freund von mir und ich waren mit einer Diskussion über currying und Teilfunktion Anwendung in Javascript, und wir kamen zu sehr unterschiedliche Schlussfolgerungen darüber, ob entweder waren erreichbar. Ich kam mit dieser Implementierung von Function.prototype.curry up, die die Grundlage unserer Diskussion war:

Function.prototype.curry = function() {
    if (!arguments.length) return this;

    var args = Array.prototype.slice.apply(arguments);
    var mmm_curry = this, args;

    return function() {
        var inner_args = Array.prototype.slice.apply(arguments);
        return mmm_curry.apply(this, args.concat(inner_args));
    }

}

Welche wird wie folgt verwendet:

var vindaloo = function(a, b) {
    return (a + b);
}

var karahi = vindaloo.curry(1);
var masala = karahi(2);
var gulai = karahi(3);

print(masala);
print(other);

dessen Ausgang ist wie folgt in Spider:

$ js curry.js
3
4

Seine Meinung war, dass da die Javascript function primitive nicht nativ nicht „Teilfunktion Anwendung“ unterstützen, um es in der Funktion auf die Variable karahi gebunden zu beziehen völlig falsch ist, als teilweise angewandt. Sein Argument war, dass, wenn die vindaloo Funktion ist curried, die Funktion selbst vollständig angewandt wird, und ein Verschluss zurückgegeben wird, nicht eine „teilweise angewandte Funktion“.

Nun, meiner Meinung nach ist, dass während Javascript selbst keine Unterstützung für die partielle Anwendung in seiner function Primitiven zu bieten hat (im Gegensatz zu sagen, ML oder Haskell), das Sie bedeutet nicht, keine Funktion höherer Ordnung der Sprache erstellen welches in der Lage ist Konzept einer teilweise angewandten Funktion einkapselt. Auch trotz des Seins „angewandt“, der Umfang der Funktion ist noch gebunden an die Schließung von ihm zurück so dass es „teilweise angewandten“.

bleiben

Was ist richtig?

War es hilfreich?

Lösung

Technisch sind Sie eine brandneue Funktion zu schaffen, die die ursprüngliche Funktion aufruft. Also, wenn mein Verständnis von teilweise angewandt Funktionen korrekt ist, ist dies nicht eine teilweise angewandte Funktion. Eine teilweise angewandte Funktion wäre näher an diesen (beachten Sie, dass dies nicht eine allgemeine Lösung):

vindaloo.curry = function(a) {
    return function(b) {
        return a + b;
    };
};

IIUC, würde dies noch nicht eine teilweise angewandt Funktion. Aber es ist näher. Eine echte teilweise angewandte Funktion würde wie folgt aussehen tatsächlich, wenn Sie den Code untersuchen können:

function karahi(b) {
    return 1 + b;
};

Also, technisch gesehen, Ihre ursprüngliche Methode ist nur eine Funktion innerhalb eines Verschlusses gebunden zurück. Der einzige Weg, ich denken kann, um wirklich teilweise eine Funktion in JavaScript anzuwenden wäre, die Funktion zu analysieren, um die Änderungen zu übernehmen, und es dann durch eine eval run ().

Allerdings Ihre Lösung eine gute praktische Anwendung des Konzepts JavaScript ist, so praktisch gesprochen erreicht das Ziel, auch wenn es technisch nicht exakt ist.

Andere Tipps

Ich denke, es ist vollkommen in Ordnung ist über Teilfunktion Anwendung zu sprechen in JavaScript - wenn es funktioniert wie teilweise Anwendung, dann muss es eins sein. Wie sonst würden Sie es nennen?

Wie Sie Ihre Curry Funktion erreicht sein Ziel ist es nur eine Implementierung Detail. In ähnlicher Weise könnten wir teilweise Anwendung in der ECMAScript-Spezifikation haben, aber wenn IE wäre es dann umsetzen wie Sie tun, würden Sie haben keine Möglichkeit, zu erfahren.

Die technischen Details für mich keine Rolle spielen - wenn die Semantik gleich und für alle Absichten und Zwecke bleiben, wirkt die Funktion, als ob es wirklich eine teilweise angewandte Funktion, wer sich interessiert?

habe ich über Dinge wie akademisch zu sein, aber über solche Einzelheiten Sorgen am Ende getan nicht bekommen echte Arbeit.

Ich persönlich benutzen MochiKit ; es hat eine schöne partial () Funktion, die bei der Schaffung eines solchen unterstützt. Ich mag es.

Sie sollten überprüfen Curried JavaScript-Funktionen . Ich habe nicht ganz meinen Kopf um seine Curry-Funktion eingewickelt, aber es könnte Ihre Antwort.

Edit:. Ich würde mit Ihrer Einschätzung zustimmen, jedoch

  

Seine Meinung war, dass da die Javascript-Funktion primitive nicht native „Teilfunktion Anwendung“ unterstützen

Sie können ziemlich elegant in ES6 tun currying:

> const add = a => b => a + b
> const add10 = add(10)
> [1,2,3].map(add10)
[ 11, 12, 13 ]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top