JS関数式プログラミング

1631 ワード

関数の組み合わせの応用:いくつかの純粋な関数、偏関数、コリメート関数から新しい関数に結合し、データ転送を形成します.
一連の必要な関数を選んで、彼らを組み合わせて、公共協力の効果を実現します.
まず、関数の組み合わせを直感的に感じます.
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);
左から右へ同化して処理することを「通路」と呼びます.