使用n参数在JavaScript中进行函数式转换 [英] Currying in javascript for function with n parameters
本文介绍了使用n参数在JavaScript中进行函数式转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如果f ::(a,b) - > c,我们可以如下定义curry(f):
curry(f)::((a ,b) - > c) - > a - > b - > c
const curry = f => a => b => f(a,b);
const sum = curry((num1,num2)=> num1 + num2);
console.log(sum(2)(3)); // 5
我们如何实现带有n个参数的泛函函数?
解决方案
如果我理解正确,我认为这是使用ES6的方法:
< pre class =snippet-code-js lang-js prettyprint-override>
const curry = f => {const nargs = f.length; const vargs = []; const curried =(... args)=> vargs.push(... args)> = nargs? f(... vargs.slice(0,nargs)):curried; const arg2 = curry((a,b)=> a + b); const arg3 = curry((a,b,c)=> a *(b + c)); const arg4 = curry((a,b,c,d)=> Math.pow(a,b *(c + d))); console.log(arg2(1)(2)); // 1 + 2console.log(arg3(2)(3)(4)); // 2 *(3 + 4)console.log(arg4(2)(1,3)(4)); // 2 ^(1 *(3 + 4))
如果你想在ES5中做到这一点,这里有一个更详细的方法:
function curry(f){var nargs = f.length; var vargs = [];返回函数curried(){var args = Array.prototype.slice.call(arguments);返回vargs.push.apply(vargs,args)> = nargs? f.apply(this,vargs.slice(0,nargs)):curried; };} var arg2 = curry(function(a,b){return a + b;}); var arg3 = curry(function(a,b,c){return a *(b + c);}); var arg4 = curry(function(a,b,c,d){return Math.pow(a,b *(c + d));}); console.log(arg2(1)(2)); // 1 + 2console.log(arg3(2)(3)(4)); // 2 *(3 + 4)console.log(arg4(2)(1,3)(4)); // 2 ^(1 *(3 + 4))
If f :: (a, b) -> c, we can define curry(f) as below:
curry(f) :: ((a, b) -> c) -> a -> b -> c
const curry = f => a => b => f(a, b);
const sum = curry((num1, num2) => num1 + num2);
console.log(sum(2)(3)); //5
How do we implement generic curry function that takes a function with n parameters?
解决方案
If I understand correctly, I think this is the way to go using ES6:
const curry = f => {
const nargs = f.length;
const vargs = [];
const curried = (...args) => vargs.push(...args) >= nargs ? f(...vargs.slice(0, nargs)) : curried;
return curried;
};
const arg2 = curry((a, b) => a + b);
const arg3 = curry((a, b, c) => a * (b + c));
const arg4 = curry((a, b, c, d) => Math.pow(a, b * (c + d)));
console.log(arg2(1)(2)); // 1 + 2
console.log(arg3(2)(3)(4)); // 2 * (3 + 4)
console.log(arg4(2)(1, 3)(4)); // 2 ^ (1 * (3 + 4))
If you want to do this in ES5, here's a slightly more verbose method:
function curry(f) {
var nargs = f.length;
var vargs = [];
return function curried () {
var args = Array.prototype.slice.call(arguments);
return vargs.push.apply(vargs, args) >= nargs ? f.apply(this, vargs.slice(0, nargs)) : curried;
};
}
var arg2 = curry(function (a, b) {
return a + b;
});
var arg3 = curry(function (a, b, c) {
return a * (b + c);
});
var arg4 = curry(function (a, b, c, d) {
return Math.pow(a, b * (c + d));
});
console.log(arg2(1)(2)); // 1 + 2
console.log(arg3(2)(3)(4)); // 2 * (3 + 4)
console.log(arg4(2)(1, 3)(4)); // 2 ^ (1 * (3 + 4))
这篇关于使用n参数在JavaScript中进行函数式转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文