JavaScript currying函数

时间:2019-04-22 11:06:54

标签: javascript currying

我的javascript编程课程中的一项作业有问题。

任务:

  

创建一个名为“计算”的函数,该函数期望将三个函数作为参数,并在调用时返回其中一个函数。

     

每次致电

let result = calculate(add, subtract, multiply)(1,3)
     

它应该返回不同的结果。

我尝试了不同的方法并遇到了类似的错误 计算不是函数或未定义乘法。

这是我到目前为止尝试过的:

function add(num1, num2){
  return num1 + num2;
}

function subtract(num1, num2){
  return num1 - num2;
}

function multiply(num1, num2){
  return num1 * num2;
}

function calculate(add, subtract, multiply){

  let randNum = Math.floor(Math.random() * 3) + 1

  switch(randNum){
    case 1:
      let add = add(num1, num2)
      break;

    case 2:
      let subtract = subtract(num1, num2);
      break;

    case 3:
      let multiply = multiply(num1, num2);
      break;

  }

}

let result = calculate(add(2,4), subtract(2,4), multiply(2,4))
console.log(result);

我对curring进行了一些研究,但看不到我出了什么问题。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

您可以从参数中获取随机函数,然后将该函数返回以再次调用带参数的函数。

const
    add = (a, b) => a + b,
    subtract = (a, b) => a - b,
    multiply = (a, b) => a * b,
    calculate = (...args) => args[Math.floor(Math.random() * args.length)];

let result = calculate(add, subtract, multiply)(1, 3);

console.log(result);

答案 1 :(得分:2)

这不是教Curry的好例子。我认为教师/课程要尝试的是在您这样做时:

let result = calculate(add, subtract, multiply)(1,3)

您正在调用一个函数(calculate),该函数返回一个函数(您通过的三个函数之一,尽管分配不清楚,但我猜是随机选择的),然后再调用该函数(通过在(1,3)调用的结果上使用calculate(...)

calculate可以是单线的:

function calculate(...fns) {
    return fns[Math.floor(Math.random() * fns.length)];
}

或在ES5中:

function calculate() {
    return arguments[Math.floor(Math.random() * arguments.length)];
}

实时示例:

function add(num1, num2){
  return num1 + num2;
}

function subtract(num1, num2){
  return num1 - num2;
}

function multiply(num1, num2){
  return num1 * num2;
}

function calculate(...fns) {
    return fns[Math.floor(Math.random() * fns.length)];
}

let result = calculate(add, subtract, multiply)(1,3);
console.log(result);


一个更有用的教cury的例子是:

let result = calculate(add, subtract, multiply)(1)(3);
// ----------------------------------------------^^

请注意,我们先用calculate调用1的结果,然后再用3调用 that 的结果。然后,calculate需要将它选择的函数包装在另一个收集1的函数中,然后等待被3调用:

function calculate(...fns) {
    const fn = fns[Math.floor(Math.random() * fns.length)];
    return (a) => {
        return (b) => {
            return fn(a, b);
        };
    };
}

或更简洁,但不太清楚:

function calculate(...fns) {
    const fn = fns[Math.floor(Math.random() * fns.length)];
    return (a) => (b) => fn(a, b);
}

实时示例:

function add(num1, num2){
  return num1 + num2;
}

function subtract(num1, num2){
  return num1 - num2;
}

function multiply(num1, num2){
  return num1 * num2;
}

function calculate(...fns) {
    const fn = fns[Math.floor(Math.random() * fns.length)];
    return (a) => (b) => fn(a, b);
}

let result = calculate(add, subtract, multiply)(1)(3);
console.log(result);

calculate返回的函数在被调用时会记住a并返回一个新函数;该函数在被调用时会得到b并调用fn(a, b)来获得结果。

该示例预先选择了该功能,但也可以在最后选择该功能:

function calculate(...fns) {
    return (a) => (b) => fns[Math.floor(Math.random() * fns.length)](a, b);
}

实时示例:

function add(num1, num2){
  return num1 + num2;
}

function subtract(num1, num2){
  return num1 - num2;
}

function multiply(num1, num2){
  return num1 * num2;
}

function calculate(...fns) {
    return (a) => (b) => fns[Math.floor(Math.random() * fns.length)](a, b);
}

let result = calculate(add, subtract, multiply)(1)(3);
console.log(result);

答案 2 :(得分:1)

calculate应该返回函数之一,因此应该使用实际的参数调用calculate函数的结果:

function add(num1, num2){
  return num1 + num2;
}

function subtract(num1, num2){
  return num1 - num2;
}

function multiply(num1, num2){
  return num1 * num2;
}

function calculate(add, subtract, multiply){

  let randNum = Math.floor(Math.random() * 3) + 1

  switch(randNum){
    case 1:
      return add
      break;

    case 2:
      return subtract
      break;

    case 3:
      return multiply
      break;

  }

}

console.log(calculate(add, subtract, multiply)(2, 4));

答案 3 :(得分:0)

这部分代码在calculate函数内部有两个问题:

  switch(randNum){
    case 1:
      let add = add(num1, num2)
      break;

    case 2:
      let subtract = subtract(num1, num2);
      break;

    case 3:
      let multiply = multiply(num1, num2);
      break;


  1. 您正在 calculate 中调用数学函数(例如add(num1, num2))。这将返回一个数字,但是预期的行为是它将返回一个函数,以便您可以使用其他参数来调用它:

    let result = calculate(add, subtract, multiply)(1,3)
    


  2. 您的calculate函数未返回任何值。因此,当您做let result = calculate(...)时,结果将始终是不确定的。


相反,您的calculate函数应返回一个函数:

    function calculate(add, subtract, multiply){

      let randNum = Math.floor(Math.random() * 3) + 1;

      switch(randNum){
          case 1:
          return add;

          case 2:
          return subtract;

          case 3:
          return multiply;
      }
    }

演示: https://jsbin.com/jiholifife/edit?js,console


请注意区别:您的功能 calculate 现在正在返回功能。
可能是由于JavaScript中的函数是First-Class对象:一个函数可以作为参数传递给其他函数,可以由另一个函数返回,也可以作为值分配给变量。