学习链接
柯里化函数
柯里化是把一个多参数函数转化成一个嵌套的一元函数的过程
const curry = function(func) {
return function curriedFn(...args) {
if(args.length < func.length) { // 输入的参数数量暂未达到形参个数
// console.log('func.length: ', func.length);
// console.log('args.length: ', args.length);
return function() {
return curriedFn.call(this, ...args.concat([...arguments]));
}
}
return func.call(this, ...args);
}
};
const curry2 = function(func) {
return function curriedFn(...args) {
if(args.length === func.length) return func(...args);
return (...rest) => curriedFn(...args, ...rest);
}
};
测试
const func = (a, b, c, d) => a * b * c * d;
const test = curry(func);
console.log('test(2)(3)(4)(5): ', test(2)(3)(4)(5));
组合函数、管道函数
组合函数 compose
,目的是将多个函数组合成一个函数
compose
执行是从右到左的。而管道函数 pipe
,执行顺序是从左到右执行的。
const compose = function(...args) {
return function(val) {
return args.reduceRight((arg, fun) => fun(arg), val);
}
};
const pipe = function(...args) {
return function(val) {
return args.reduce((arg, fun) => fun(arg), val);
}
};
// 箭头函数实现
const compose2 = (...args) => val => args.reduceRight((arg, fun) => fun(arg), val);
const pipe2 = (...args) => val => args.reduce((arg, fun) => fun(arg), val);
测试
const afn = a => a * 2;
const bfn = b => b * 3;
const cfn = c => c * 4;
const func = compose(afn, bfn, cfn);
console.log('func(2): ', func(2));