我們不使用for loop
函數式編程,而是使用higher order functions
,如map,filter,reduce等。這些都適用於遍歷數組。函數式編程 - 簡單循環遞增計數器
但是,我不知道如何做一個簡單的計數器循環。
let i = 0;
for(i; i < 10; i++) {
console.log("functional programming is a religion")
};
那麼,如何在功能性編程中做到這一點?
我們不使用for loop
函數式編程,而是使用higher order functions
,如map,filter,reduce等。這些都適用於遍歷數組。函數式編程 - 簡單循環遞增計數器
但是,我不知道如何做一個簡單的計數器循環。
let i = 0;
for(i; i < 10; i++) {
console.log("functional programming is a religion")
};
那麼,如何在功能性編程中做到這一點?
的功能的方法是寫一個創建它要求最基本的功能ñ次功能上的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();
那麼,如何在功能性編程中做到這一點?
它沒有做多少實際,你仍然可以使用forEach
一點點workaround
Array.apply(null, Array(5)).forEach(function(){
console.log("funtional programming is a religion")
});
5是要重複的次數。
使用簡單的遞歸函數
function counter(value) {
var i = value;
if(i<10){
console.log("functional programming is a religion");
}else{
return;
}
counter(++i);
}
counter(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是一種宗教
函數式編程是一種宗教
函數式編程是一種宗教
函數式編程是一種宗教
函數式編程是一種宗教
函數式編程是一種宗教
函數式編程是一種宗教
請讓我知道您對此答案的看法。
爲什麼不建立一個高階函數爲數字。
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>'); });
整個問題就是讓大部分代碼都可以測試。對於你的例子,我想最好的是創建文本而不打印它。
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的使用。
我刪除了我的,你的代碼更優雅。 –
值得注意的是,「純」功能解決方案涉及遞歸,而不是「while」。然而,在這個時候,'while'的性能比遞歸好得多。 –