javascript - 求和函数柯里化(Currying)

标签 javascript currying

我正在尝试编写一个执行以下操作的求和函数:

sum(1)(2)(3) => 返回 6

但是,我的解决方案遇到了困难。我知道我犯了一个愚蠢的错误,有人可以指出我正确的方向吗?

我的实现:

function add(args) {
  let sum = args[0];
  let func = function(...args2) {
    if (!args2[0]) return sum;
    sum += args2[0];
    return func;
  }
  return func;
}


add(1)(2)(3);

此外,我可以编写一个通用函数来执行以下操作吗? 添加(1)(2)(3) 或添加(1)(2)(3) () => 6

最佳答案

要进行任意数量的调用,所有这些调用都需要一个数字,您需要返回值同时作为一个函数一个数字来表现。这样:

const five = add(2)(3);
console.log(five(10)); // behaves like a function
console.log(five + 10); // behaves like a number

除了我称之为 hack 的方法之外,我无论如何也想不出该怎么做(或者如果有一个很好的理由应该这样做)。



话虽如此,为了好玩,我能够通过滥用 valueOf() 来执行以下操作:

const add = (num1) => {
  const func = (num2) => add(num1 + num2);
  func.valueOf = () => num1;

  return func;
}

console.log(add(1)(2)(3)); // *logs function* [output varies by environment]

console.log(add(1)(2)(3) + 10);  // 16
console.log(add(1)(2) + 10);  // 13
console.log(add(1) + 10);  // 11

console.log(add(1)(2)(3) == 6); // true
console.log(add(1)(2)(3) === 6); // false

console.log(typeof add(1)(2)(3)); // function
console.log(typeof (add(1)(2) + 3)); // number

但这显然不是很符合 kosher。


编辑:根据@PatrickRoberts 的 comment 从使用 toString() 切换到 valueOf() .

关于javascript - 求和函数柯里化(Currying),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52124406/

相关文章:

scala - scala中的 curry 函数

javascript - 函数返回值而不用给定参数替换变量

typescript - 如何在 TypeScript 中手动柯里化(Currying)一个函数?

JavaScript/jQuery - 重用元素的事件 'Click'

Javascript 从 url 中删除符号 "amp;"

javascript - ||如何(OR) 运算符(operator)在作业中工作

javascript - 'Currying'是什么?

r - 如何在 R 中按位置 curry ...参数?

javascript - jQuery Mobile 可折叠集中的 JS 效果(js 不执行)

java - 无法在小程序中使用 swing UI - 调用公共(public)方法