组合函数定义

组合函数是纯函数衍生出来的一种函数,把一个纯函数的结果做为另一个纯函数的输入,最终得到一个新的函数,就是组合函数,组合函数是从右到左的数据流,例如

const compose = (f1, f2) => value => f1( f2(value) );

举个例子,我们需要实现一个 fullname 的功能

function connect(firstName, lastName) {
return firstName + lastName;
}
function toUpperCase(name) {
return name.toUpperCase();
}

把上面两个函数组合起来就变成了下面的函数,叫做组合函数

function fullname(firstName, lastName) {
return toUpperCase(connect(firstName, lastName));
}
fullname('huang', 'kailun');

这个只是一个简单的例子,为了说明把多个功能函数组合成一个更高级功能的函数。

组合函数转换器

上面的例子是两个纯函数的组合,如果是多个函数的组合(比如 f, f1, f2, f3),类似于下面的组合,就会变得很恶心

function componse(...args) {
return f(f2(f3(f4(...args))));
}

这时候就需要一种组合函数转换器,通过传递函数数组来自动帮我们转为成组合函数,结构类似于

const componse =
(...functions) =>
(...args) => {
// 转换操作
return newFunction;
};

Javascript 给数组对象提供了一个 reduceRight() 方法,接收一个函数作为累加器,数组从右到左开始缩减,最终计算为一个值,使用如下

[1, 2, 3].reduceRight((prev, curr) { return prev + curr }, 0) // 6

我们可以利用 reduceRight 这一个特性来实现组合函数转换器

const componse = (...fns) =>
fns.reduceRight(
(pFn, cFn) =>
(...args) =>
cFn(pFn(...args))
);

测试效果

// 新增一个hello函数
function hello(name) {
return `hello ${name}`;
}
const sayHello = componse(hello, toUpperCase, connect);
console.log(sayHello('huang', 'kelen')); // hello HUANG KAILUN