Javascript функция карри - PullRequest
       14

Javascript функция карри

0 голосов
/ 22 апреля 2019

У меня проблема с одним из заданий в моем курсе программирования на 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);

Я провел некоторые исследования по карри, но я могуне вижу, что я делаю неправильно.Буду признателен за любую помощь.

Ответы [ 4 ]

3 голосов
/ 22 апреля 2019

Вы можете взять случайную функцию из аргументов и вернуть эту функцию для другого вызова с параметрами.

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 голосов
/ 22 апреля 2019

Это не отличный пример для обучения карри. Я думаю, что преподаватель / курс пытается донести до нас то, что когда вы делаете:

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

Live Пример:

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

Более полезным примером для обучения карри будет:

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

Live Пример:

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

Live Пример:

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 голос
/ 22 апреля 2019

Функция расчета должна возвращать одну из функций, поэтому результат функции вычисления должен вызываться с фактическими параметрами:

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 голосов
/ 22 апреля 2019

У вас есть две проблемы в этой части кода внутри функции 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;
      }
    }

Демонстрация: https://jsbin.com/jiholifife/edit?js,console


Обратите внимание на разницу: ваша функция calculate теперь возвращаетсяфункция.
Это возможно из-за того, что функции в JavaScript являются объектами первого класса : функция может быть передана в качестве аргумента другим функциям, может быть возвращена другой функциейи может быть назначен в качестве значения переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...