JS函数式编程--函数组合应用
程序员文章站
2024-03-03 16:23:04
...
函数组合应用:由若干个纯函数、偏函数、柯里化函数组合成一个新的函数,同时,形成数据传递。
挑选了一系列所需要的函数,把他们组合在一起,可以实现公共合作的效果。
先来,直观感受一下函数组合:
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);
}
}
es6写法:
const compose = (...args) => x => args.reduceRight((res, cb) => cb(res), x);
自左向右同理处理,通常称为“通道”。
下一篇: .NET 线程基础的使用介绍