在javascript中解决n个参数的curried函数

Jyo*_*Pal 6 javascript functional-programming currying

如果f :: a - > b - > c是curry,那么uncurry(f)可以定义为:

uncurry ::(a - > b - > c) - >((a,b) - > c)

我正在尝试在javascript中实现上述功能.我的下面的实现是否正确和通用,还是有更好的解决方案?

const uncurry = f => {
  if (typeof f != "function" || f.length == 0)
    return f;

  return function()
  {     
    for (let i = 0; i < arguments.length; i++){
      f = f(arguments[i]);
    }

    return f;
  };
}


const curry = f => a => b => f(a, b);
const curriedSum = curry((num1, num2) => num1 + num2);
console.log(curriedSum(2)(3)); //5

console.log(uncurry(curriedSum)(2, 3)); //5
Run Code Online (Sandbox Code Playgroud)

小智 3

你的uncurry问题有三个:

  1. 如果未传递所有预期参数,它将返回一个柯里化函数(这不是正常的非柯里化函数的行为)
  2. 它无法处理不必要的争论
  3. 该实现不是很实用,因为您没有重用任何东西

这是一种更实用的方法:

const id = x => x;
const uncurry = f => (x, y) => f(x)(y);

const uncurryn = n => f => (...xs) => {
  const next = acc => xs => xs.reduce(uncurry(id), acc);
  if (n > xs.length) throw new RangeError("too few arguments");
  return next(f) (xs.slice(0, n));
}

const sum = x => y => z => x + y + z;

try {uncurryn(3)(sum)(1, 2)} catch(e) {console.log(e.message)}
console.log(uncurryn(3)(sum)(1, 2, 3));
console.log(uncurryn(3)(sum)(1, 2, 3, 4));
Run Code Online (Sandbox Code Playgroud)

uncurryn像 Javascript 中的任何其他函数一样忽略不必要的参数。它重用uncurry,reduceid.

如果传递的参数太少,则会抛出错误,因为在每种情况下都不清楚应返回哪个值(NaN, undefined)。