2016-05-02 9 views
1

Wir verwenden for loop nicht in der funktionalen Programmierung, stattdessen verwenden wir higher order functions wie map, filter, reduce usw. Diese sind gut für die Iteration durch ein Array.Funktionale Programmierung - einfache For-Schleife zum Inkrementieren des Zählers

Allerdings frage ich mich, wie mache ich eine einfache Zählerschleife.

let i = 0; 
for(i; i < 10; i++) { 
    console.log("functional programming is a religion") 
}; 

Also, wie würde man dies in der funktionalen Programmierung tun?

Antwort

9

Ein funktioneller Ansatz wäre eine HOF zu schreiben, die eine Funktion erstellt, die eine zugrunde liegende Funktion n mal ruft:

function repeatTimes(fn, n) { 
    return function() { 
    while (n--) fn(...arguments); 
    }; 
} 

Nun würden Sie Ihre Funktion aufrufen als folgt:

function myFunc() { console.log("functional programming is a religion"); } 

const tentimes = repeatTimes(myFunc, 10); 
tentimes(); 

Dieser Ansatz kann erweitert werden, indem die Bedingung für die Fortsetzung der wiederholten Anrufe verallgemeinert wird. Anstelle einer festen Zahl n übergeben wir eine Funktion, die bestimmt, wann zu stoppen ist. Wir werden diese Funktion, um die Iterationszahlcode passieren:

function repeatWhile(fn, cond) { 
    return function() { 
    var count = 0; 
    while (cond(count++)) fn(...arguments); 
    }; 
} 

Nun wir nennen dies als

const tentimes = repeatWhile(myFunc, i => i < 10); 
tentimes(); 

wir weiter diese über eine Funktion optimieren könnte, die die Bedingung Funktion erstellt, die wir lessThan nennen würde:

function lessThan(n) { return i => i < n; } 

Nun kann der Aufruf als

geschrieben werden
+0

Ich habe meins gelöscht, Ihr Code ist eleganter. –

+3

Es ist erwähnenswert, dass eine "reine" funktionale Lösung Rekursion beinhalten würde und nicht "while". Zu diesem Zeitpunkt ist 'while' jedoch wesentlich leistungsfähiger als Rekursion. –

0

Also, wie würde man dies in der funktionalen Programmierung tun?

Es ist eigentlich nicht viel zu tun, haben Sie immer forEach mit einem kleinen workaround

Array.apply(null, Array(5)).forEach(function(){ 
console.log("funtional programming is a religion") 
}); 

5 ist die Anzahl der Male durchlaufen können Sie wollen.

0

eine einfache rekursive Funktion

function counter(value) { 
    var i = value; 
    if(i<10){ 
     console.log("functional programming is a religion"); 
    }else{ 
     return; 
    } 
     counter(++i);  
} 
    counter(0); 
0

Wie wäre diese verwenden?

/*forLoop takes 4 parameters 
1: val: starting value. 
2: condition: This is an anonymous function. It is passed the current value. 
3: incr: This is also an anonymous function. It is passed the current value. 
4: loopingCode: Code to execute at each iteration. It is passed the current value. 
*/ 

var forLoop = function(val, condition, incr, loopingCode){ 
    var loop = function(val, condition, incr){ 
    if(condition(val)){ 
     loopingCode(val); 
     loop(incr(val), condition, incr); 
    } 
    }; 
    loop(val, condition, incr); 
} 

dann wird die Schleife nennen wie folgt:

forLoop(0, 
     function(x){return x<10}, 
     function(x){return ++x;}, 
     function(x){console.log("functional programming is a religion")} 
    ); 

Output: funktionale Programmierung ist eine Religion

funktionale Programmierung ist eine Religion

funktionale Programmierung ist eine Religion

Funktionsprogramm ng ist eine Religion

funktionale Programmierung ist eine Religion

funktionale Programmierung ist eine Religion

funktionale Programmierung ist eine Religion

funktionale Programmierung ist eine Religion

funktionale Programmierung ist eine Religion

funktionale Programmierung ist eine Religion

Lassen Sie mich wissen, was Sie über diese Antwort denken.

0

Warum nicht eine höhere Order-Funktion für Numbers erstellen.

Number.prototype.repeat = function (fn) { 
 
    var i, 
 
    n = Math.abs(Math.floor(this)) || 0; 
 
    for (i = 0; i < n; i++) fn(i, this); 
 
}; 
 

 
(10).repeat(function (i, n) { document.write(i + ' of ' + n + ': your claim<br>'); }); 
 
(NaN).repeat(function (i, n) { document.write(i + ' of ' + n + ': your claim<br>'); });

1

Der springende Punkt wäre, den Großteil Ihres Codes testbar zu machen. Ich denke, am besten wäre es, den Text zu erstellen, ohne ihn zu drucken.

function unFold(fnStopPredicate, fnTerm, fnGenerate, aSeed) { 
    var arr = []; 
    while(! fnStopPredicate(aSeed)){ 
     arr.push(fnTerm(aSeed)); 
     aSeed = fnGenerate(aSeed); 
    } 
    return arr; 
} 

Man könnte sagen, dass dies nicht funktioniert und das ist wahr, aber es hat eine funktionale Schnittstelle. Es mutiert seine Argumente nicht und der zurückgegebene Wert ist immer ein direktes Ergebnis seiner anfänglichen Argumente.

var strValues = unFold(x => x > 10, 
         x => "functional programming is a religion", 
         x => x+1, 
         0).join("\n"); 

// Real side effect goes here 
console.log(strValues); 

Der wichtigste Punkt hier ist, dass Sie Gerät die Verwendung von sich entfalten, solange die Funktion keine Nebenwirkungen selbst zu tun hat Sie liefern testen kann.

Verwandte Themen