Javascript 如何在JS中重用返回结果创建可变高阶函数
假设我有一个数量不确定的函数f,每个函数需要一个参数并返回一个结果。我应该如何编写一个函数“execute”,将第一个参数作为数字,将所有其他参数作为函数应用于前面每个函数的结果 以下是我的猜测: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
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
),但是规范作者决定采取另一种方法。客观上,我对函数式编程的偏好与你的不同。:)