Функция суммирования карри - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь написать функцию суммы, которая выполняет следующее:

sum(1)(2)(3) => returns 6

Однако мне трудно с моим решением. Я знаю, что делаю глупую ошибку, может кто-то указать мне правильное направление?

Моя реализация:

function add(args) {
  let sum = args[0];
  let func = function(...args2) {
    if (!args2[0]) return sum;
    sum += args2[0];
    return func;
  }
  return func;
}


add(1)(2)(3);

Кроме того, могу ли я написать универсальную функцию, которая выполняет следующие действия? добавить (1) (2) (3) или добавить (1) (2) (3) () => 6

Ответы [ 4 ]

0 голосов
/ 01 сентября 2018
function sum(x){
   return function (y){
      return function(z){
        return x+y+z;
     }
   }
}

Вы можете позвонить как: сумма (1) (2) (3) * * тысяча два

0 голосов
/ 01 сентября 2018

Чтобы иметь произвольное количество вызовов, все из которых принимают число, необходимо, чтобы возвращаемое значение действовало как функция и в зависимости от числа. Так что:

const five = add(2)(3);
console.log(five(10)); // behaves like a function
console.log(five + 10); // behaves like a number

Я не могу придумать, как это сделать (или если есть веская причина, по которой должен сделать это), кроме того, что я бы назвал хаком.



С учетом вышесказанного, ради забавы, я смог сделать следующее, злоупотребив valueOf():

const add = (num1) => {
  const func = (num2) => add(num1 + num2);
  func.valueOf = () => num1;

  return func;
}

console.log(add(1)(2)(3)); // *logs function* [output varies by environment]

console.log(add(1)(2)(3) + 10);  // 16
console.log(add(1)(2) + 10);  // 13
console.log(add(1) + 10);  // 11

console.log(add(1)(2)(3) == 6); // true
console.log(add(1)(2)(3) === 6); // false

console.log(typeof add(1)(2)(3)); // function
console.log(typeof (add(1)(2) + 3)); // number

Но это, очевидно, не очень кошерный.


Редактировать: Переключено с использования toString() на valueOf() за комментарий @ PatrickRoberts .

0 голосов
/ 01 сентября 2018

Рекурсия кого-нибудь? ?

function add(n) {
  return function(m) {
    if (isNaN(m)) return n;
    return add(n + m);
  };
}

// add(1)(2)(3)() => 6
// add(1)(2)(3)("")() => "6"
// add(1)("2")(3)() => "123"

// functional one liner
const add = n => m => isNaN(m) ? n : add(n + m);
0 голосов
/ 01 сентября 2018

Попробуйте, вы опустили оператор распространения

function add(...args) {
        let sum = args[0];
        let func = function(...args2) {
            if(args2[0] === undefined) return sum;
            sum += args2[0];
            return func;
        }
        return func;
    }
    
    
    console.log(add(1)(2)(3)());

ура !!

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