У вас есть лучший способ использовать карри для операции добавления? - PullRequest
0 голосов
/ 24 марта 2019

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

add(1)(2, 3)(4)   
add(1)(2)(3)(4)  
add(1, 2, 3, 4)

Я пробовал три метода, но все три метода ошибочны.У вас есть лучший метод?

Вот три метода, которые я попробовал:

  1. function add() {
      var arg = Array.prototype.slice.call(arguments);
      var fn = function() {
        arg = arg.concat(Array.prototype.slice.call(arguments));
        return add.apply(null, arg);
      }
      fn.valueOf = function() {
        return arg.reduce(function(a, b) {
          return a + b;
        })
      }
      return fn;
    }
    console.log(add(1,2,3,4));
    console.log(add(1)(2,3)(4));
    console.log(add(1)(2)(3)(4));
    

Недостаток в том, что в Chrome этот методпечатает символ f (представляющий функцию) перед каждым результатом, и в Firefox он не вступает в силу и просто печатает как функцию.

function curry(fn) {
  var arg = [];
  return function() {
    if(arguments.length === 0) {
      return fn.apply(null, arg);
    }
    else {
      arg = arg.concat(Array.prototype.slice.call(arguments));
      return arguments.callee;
    }
  }
}
var add = curry(function() {
  var arg = [].slice.call(arguments);
  return arg.reduce(function(a, b) {
    return a + b;
  })
})
console.log(add(1, 2, 3, 4)(10, 20)());  // 40

Недостатком является то, что при каждом использовании требуется дополнительный вызов, чтобы сообщить функции, что пора вызывать fn, в противном случае результатом является сама функция.

function curry(fn, length) {
  return function currying(...arg) {
    if(arg.length < length) {
      return function(...arg1) {
        return currying.apply(this, arg.concat(arg1));      
      }
    }
    else {
      return fn.apply(this, arg);
    }
  }
}
var add = curry(function(...arg) {
  return arg.reduce(function(a, b) {
    return a + b;
  })
}, 4)   // This 4 right here means the number of Numbers to add

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

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