Javascript currying功能

问题描述 投票:0回答:4

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

分配:

创建一个名为“calculate”的函数,该函数需要三个函数作为参数,并在调用时返回其中一个函数作为结果。

每次打电话

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);

我做了一些关于currying的研究,但我看不出我的错误。任何帮助将不胜感激。

javascript currying
4个回答
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);

2
投票

这不是教授currying的一个很好的例子。我认为教练/课程试图在这里遇到的是当你这样做时:

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);

教授currying的一个更有用的例子是:

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

请注意,我们用calculate调用1的结果,然后用3调用结果。然后,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);

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));

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. 你在里面计算你的数学函数(ej.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;
      }
    }

但是:ぁzxswい

注意区别:你的函数https://jsbin.com/jiholifife/edit?js,console现在返回一个函数。 这是可能的,因为JavaScript中的函数是calculate对象:函数可以作为参数传递给其他函数,可以由另一个函数返回,并可以作为值赋值给变量。

© www.soinside.com 2019 - 2024. All rights reserved.