Javascript 如何在JS中重用返回结果创建可变高阶函数

Javascript 如何在JS中重用返回结果创建可变高阶函数,javascript,function,variadic,Javascript,Function,Variadic,假设我有一个数量不确定的函数f,每个函数需要一个参数并返回一个结果。我应该如何编写一个函数“execute”,将第一个参数作为数字,将所有其他参数作为函数应用于前面每个函数的结果 以下是我的猜测: let plus1 = d => d += 1; let plus2 = d => d += 2; let write = d => document.write(d); let execute = function(n,...functions){ functions.fo

假设我有一个数量不确定的函数f,每个函数需要一个参数并返回一个结果。我应该如何编写一个函数“execute”,将第一个参数作为数字,将所有其他参数作为函数应用于前面每个函数的结果

以下是我的猜测:

let plus1 = d => d += 1;
let plus2 = d => d += 2;
let write = d => document.write(d);


let execute = function(n,...functions){
  functions.forEach((d)=>d(n));
}

execute(4,plus1,plus2,write); 
我期待7((4+1)+2)

谢谢你的帮助

在使用具有给定值的函数时,可以使用返回结果的

让plus1=d=>d+1,
plus2=d=>d+2,
write=d=>console.log(d),
execute=(n,…fn)=>fn.reduce((n,f)=>f(n,n);

执行(4,plus1,plus2,write)两个函数的单项式组合正是您想要的:它通过所有组合函数传播参数,与您的示例不同的是,所有结果后来都由另一个单项式组合组合:

函数monoidCombine(f,g){
设f类型=f的类型;
设gtype=typeof g;
if(ftype==“函数”&>ype==“函数”){
返回函数(输入){
返回单输入组合(f(输入),g(输入));
};
}
如果(ftype==“number”&>ype==“number”){
返回f+g;
}
抛出新错误(`monoidCombine(${ftype},${gtype})没有案例`);
}
函数执行(n,…函数){
返回函数.reduce((f,g)=>monoidCombine(f,g))(n);
}
执行(1,(x)=>x+3,(x)=>x+1);
//^--相当于((x)=>x+3)(1)+((x)=>x+1)(1)

//因此结果是6
可以是
let execute=(…fn)=>fn.reduce((n,f)=>f(n))@YuryTarabanko最好不要养成忽略初始累加器值的习惯。另外,
fn
的名称不再准确,因为它现在是一个具有一个数字和函数的异构数组。@Bergi为什么?这种多形性行为在文档中得到了完美的描述。我有点喜欢它检查我的数组是否有值。除了你的个人喜好,还有其他原因吗?@YuryTarabanko客观地说,这是更好的类型,更干净,更易于维护的代码。但是是的,使用它可以归结为对函数式编程的偏好。@Bergi我希望有
reduce1
fold11
),但是规范作者决定采取另一种方法。客观上,我对函数式编程的偏好与你的不同。:)