gpt4 book ai didi

javascript - 取消 javascript 中 n 个参数的柯里化(Currying)函数

转载 作者:数据小太阳 更新时间:2023-10-29 05:29:01 25 4
gpt4 key购买 nike

如果 f::a -> b -> c 是柯里化(Currying)的,那么 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

最佳答案

您的 uncurry 存在三个问题:

  1. 如果没有传递所有预期的参数,它会返回一个柯里化(Currying)函数(这不是正常的、非柯里化(Currying)函数的行为)
  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));

uncurryn 像 Javascript 中的任何其他函数一样忽略不必要的参数。它重用了 uncurryreduceid

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

关于javascript - 取消 javascript 中 n 个参数的柯里化(Currying)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38657000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com