Как выполнить одну функцию, будь она нормальной или переносимой и дать тот же результат? - PullRequest
1 голос
/ 29 мая 2019

Каким будет тело функции multiply, которая, если ее выполнить обоими способами ниже, даст одинаковый результат.Таким образом, вызов multiply(2,4) или multiply(2)(4) приведет к выводу 8?

Ответы [ 4 ]

1 голос
/ 29 мая 2019

Вы можете проверить, пройден второй аргумент или нет.

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))
0 голосов
/ 29 мая 2019

const multiply = (a,b) => !b ? (b) => a * b : a * b; 
console.log(multiply(2, 4))
console.log(multiply(2)(4))
0 голосов
/ 29 мая 2019

Всякий раз, когда у вас есть функция curied, вам нужен какой-то способ завершить каррирование, так же как вам нужен базовый случай для рекурсии. Это конечное условие может быть либо

(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);
0 голосов
/ 29 мая 2019

Довольно просто - проверьте, существует ли второй аргумент, и измените возвращаемое значение соответствующим образом:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...