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问题有三个:
这是一种更实用的方法:
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,reduce和id.
如果传递的参数太少,则会抛出错误,因为在每种情况下都不清楚应返回哪个值(NaN, undefined)。