1

multiply如果以以下两种方式执行将给出相同结果的函数的主体是什么。那么是调用multiply(2,4)还是multiply(2)(4)输出 8?

4

4 回答 4

1

您可以检查第二个参数是否通过。

function multiply(a,b){
  if(b === undefined){
    return function(b){
      return a * b;
    }
  }
  return a * b
}

console.log(multiply(2,4))
console.log(multiply(2)(4))

于 2019-05-29T12:30:47.773 回答
0

每当你有一个 curied 函数时,你需要某种方法来结束这个currying,就像你需要一个基本情况来进行递归一样。结束条件可以是

(1) 参数的数量,例如在这种情况下为 2:

  const curry = (fn, n) => {
     const c = (...args) => (...args2) => args.length + args.length >= n ? fn(...args, ...args2) : c(...args, ...args2);
     return c();
  };

  const add = curry((a, b) => a + b, 2);

(1b) 当然也可以从函数签名中得出:

 const curry = (fn, ...keep) => (...args) => keep.length + args.length >= fn.length ? fn(...keep,  ...args) : curry(fn, ...keep, ...args);

 const add = curry((a, b) => a + b);

(2) 最终的空函数调用,例如add(1, 2)()add(1)(2)()

   const curry = fn => (...args) => (...args2) => args2.length ? curry(fn)(...args, ...args2) : fn(...args, ...args2);

  const add = curry((a, b) => a + b);

(3) 最后进行一些类型转换,以触发要计算的结果,例如+add(1, 2)+add(1)(2)

  const curry = (fn, ...keep) => {
    const c = (...args) => curry(fn, ...keep, ...args);
    c.valueOf = () => fn(...keep);
    return c;
  };

  const add = curry((a, b) => a + b);
于 2019-05-29T12:35:40.687 回答
0

const multiply = (a,b) => !b ? (b) => a * b : a * b; 
console.log(multiply(2, 4))
console.log(multiply(2)(4))

于 2019-05-29T12:36:56.277 回答
0

相当简单 - 检查第二个参数是否存在,并相应地修改返回值:

const multiply = (a, b) => b ? a * b : c => a * c;
console.log(multiply(2, 3));
console.log(multiply(2)(4));

这也可以相当简单地扩展为采用三个参数:

const multiply = (a, b, c) => c ? a * b * c : (b ? (d => a * b * d) : (d, e) => a ? d * e : f => d * f);
console.log(multiply(2, 3, 4));
console.log(multiply(2, 5)(3));
console.log(multiply(2)(6, 3));

于 2019-05-29T12:34:10.193 回答