使用n参数在JavaScript中进行函数式转换 [英] Currying in javascript for function with n parameters

查看:116
本文介绍了使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆