我一直在研究管道函数,并且遇到了以_pipe函数为参数的reduce函数。 _pipe函数具有两个参数a,b,然后返回另一个函数。
如何减少此处的工作?
add3 = x => x + 3;
add5 = x => x + 5;
const _pipe = (a, b) => (arg) => b(a(arg))
const pipe = (...ops) => ops.reduce(_pipe)
const add = pipe(add3, add5)
add(10)
输出 18
答案 0 :(得分:2)
查看管道函数定义:
const pipe = (...ops) => ops.reduce(_pipe)
它接收称为ops的函数数组(称为rest params)。 然后我们将reduce称为ops数组。减速器功能有2个参数:累加器和当前值。
这是我们的_pipe用易于理解的变量编写的:
const _pipe = (accumulator, currentValue) => (arg) => currentValue(accumulator(arg));
因此_pipe的结果将是来自ops数组的咖喱函数。
如果是[add3,add5],则结果将是(arg)=> add3(add5(arg))
如果是[add3,add5,add2],则结果为:(arg)=> add2(accumulator(arg)),其中accumulator为(arg)=> add3(add5(arg))。
您只需使用reduce即可从数组组成所有函数。然后传递初始值为10。
就像:add3(add5(10))= 18
答案 1 :(得分:0)
reduce
功能等效于
add3 = x => x + 3;
add5 = x => x + 5;
const _pipe = (a, b) => (arg) => b(a(arg))
const pipe = (...ops) => {
// create a base function
let sum = x => x;
// for every operation
for (let op of ops) {
// call _pipe with sum and it
// equivalent to sum = x => sum(op(x))
sum = _pipe(sum, op)
}
// return the resulting function
return x => sum(x)
}
const add = pipe(add3, add5)
console.log(add(10))