JS関数式プログラミング
1631 ワード
関数の組み合わせの応用:いくつかの純粋な関数、偏関数、コリメート関数から新しい関数に結合し、データ転送を形成します.
一連の必要な関数を選んで、彼らを組み合わせて、公共協力の効果を実現します.
まず、関数の組み合わせを直感的に感じます.
前回の実行結果をパラメータとして次の実行に伝える必要があるので、reduceを使って最適化することができます.
一連の必要な関数を選んで、彼らを組み合わせて、公共協力の効果を実現します.
まず、関数の組み合わせを直感的に感じます.
function compose(f, g){
return function(x){
return f(g(x)); // , , x
}
}
続いて見ます// 【 】
function toUpperCase(str){
return str.toUpperCase();
}
function add(str){
return str + '!';
}
var f = compose(toUpperCase, add);
f('Hello'); //HELLO!
しかし、composeは普遍的な意味を持っていません.今は普遍的な意味を持つ組み合わせ関数を書きます.function compose() {
var args = Array.prototype.slice.call(arguments),// arguments
len = args.length - 1;
return function(x){
var result = args[len](x);
while(len--){
result = args[len](result);
}
return result;
}
}
// 3
function split(arr){
return arr.split('');
}
function reverse(arr){
return arr.reverse();
}
function join(arr){
return arr.join('-');
}
//
// 'time' ==> 'E-M-I-T!'
// :time => TIME => T,I,M,E => E,M,I,T => E-M-I-T => E-M-I-T!
var f1 = compose(add, join, reverse, split, toUpperCase);
f1('time'); // E-M-I-T!
前回の実行結果をパラメータとして次の実行に伝える必要があるので、reduceを使って最適化することができます.
function compose(){
var args = [].slice.call(arguments);
return function(x) {
return args.reduceRight(function(res, cb){
return cb(res);
}, x);
}
}
es 6の書き方:const compose = (...args) => x => args.reduceRight((res, cb) => cb(res), x);
左から右へ同化して処理することを「通路」と呼びます.