2016-07-31 9 views
1

Meine Aufgabe ist es, eine Funktion höherer Ordnung für die Verkettung einer Liste von unären Funktionen zu schreiben. Das erste Argument ist ein Array, das die Namen der Funktionen enthält. Der zweite Parameter ist der Wert zu sein verwendet mit Funktionen. Hier ist der CodeUnary Funktion Chaser Javascript

function square (x) {return x * x;} 
function add3 (x) {return x + 3;} 

    function chainer(a) { 
    return function (b) { 
     for(var i = 0; i < a.length; i++) { 
     return a[i](b) 
     } 
     } 
    } 
    console.log(chainer([square, add3])(4)); 

Die gewünschte Ausgabe 19 ist, aber es führt nur die erste Funktion und druckt 16. Ich glaube, ich würde brauchen diese Funktionen irgendwie zu komponieren, aber kann leider nicht meinen Kopf herum wickeln. Müsste ich die Methoden apply() oder call() verwenden, um die Aufgabe abzuschließen? Ich bin neu in der funktionalen Programmierung.

+0

Was ist 'add1'? – Amit

+0

Oh, es ist ein Tippfehler, hatte es eilig zu tippen. Schon behoben. Danke für das Aufzeigen) – Alex

Antwort

2

Ihr Problem ist, dass return a[i](b)tut nur die erste Funktion aufrufen und sofort das Ergebnis zurückgeben. Sie werden die return nach der Schleife setzen müssen:

for (var i = 0; i < a.length; i++) { 
    b = a[i](b) 
} 
return b 

Alternativ ist dies ein großer Anwendungsfall für reduce/fold (die Sie wahrscheinlich vor Funktions Zusammensetzung angetroffen haben):

return function(b) { 
    return a.reduce(function(b, f) { return f(b) }, b) 
}; 

oder sogar

return a.reduce(compose, function id(x) { return x; }); 
+0

Vielen Dank. Ich dachte, es könnte ein Problem mit dem Oszilloskop geben. Und ja, ich habe diese Methoden schon mal gesehen. Tolle Hilfe! Wie würde ich diese Methode in umgekehrter Reihenfolge verwenden? In For-Schleife könnte ich "i--" verwenden, ist es möglich, es zu reduzieren? – Alex