2016-05-02 74 views
1

我們不使用for loop函數式編程,而是使用higher order functions,如map,filter,reduce等。這些都適用於遍歷數組。函數式編程 - 簡單循環遞增計數器

但是,我不知道如何做一個簡單的計數器循環。

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

那麼,如何在功能性編程中做到這一點?

回答

9

的功能的方法是寫一個創建它要求最基本的功能ñ次功能上的HOF:

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

現在你會打電話給你的功能如下:

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

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

這種方法可以通過推廣繼續重複呼叫的條件來擴展。我們將傳遞一個函數來決定何時停止,而不是固定的數字n。我們將通過該功能的迭代次數:

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

現在我們把這個作爲

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

我們可以通過它創造條件功能,我們稱之爲lessThan功能進一步簡化這一點:

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

現在調用可以寫成

const tentimes = repeatWhile(myFunc, lessThan(10)); 
tentimes(); 
+0

我刪除了我的,你的代碼更優雅。 –

+3

值得注意的是,「純」功能解決方案涉及遞歸,而不是「while」。然而,在這個時候,'while'的性能比遞歸好得多。 –

0

那麼,如何在功能性編程中做到這一點?

它沒有做多少實際,你仍然可以使用forEach一點點workaround

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

5是要重複的次數。

0

使用簡單的遞歸函數

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

樣?

/*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); 
} 

然後調用循環如下:

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

輸出: 功能的編程是一種宗教

功能的編程是一種宗教

功能的編程是一種宗教

功能編程NG是一種宗教

函數式編程是一種宗教

函數式編程是一種宗教

函數式編程是一種宗教

函數式編程是一種宗教

函數式編程是一種宗教

函數式編程是一種宗教

請讓我知道您對此答案的看法。

0

爲什麼不建立一個高階函數爲數字。

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

整個問題就是讓大部分代碼都可以測試。對於你的例子,我想最好的是創建文本而不打印它。

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

你可能會說這不起作用,這是真的,但它有一個功能接口。它不改變它的參數,返回的值總是它的初始參數的直接結果。

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); 

這裏的要點是,只要你提供的函數本身沒有副作用,你可以單元測試unFold的使用。