Javascript currying infinita para além que suporta invocações infinitos e infinitos argumentos por invocação?

votos
0

Em uma recente entrevista me pediram para criar uma função descrita em abaixo trecho de código

add(2,3,4)(5,6)(7,8); // Should yield 35

Como visto no trecho acima há uma função chamada 'add', que pode ser invocado infinitamente e por invocação pode acomodar infinitos argumentos. No final, ele deve retornar soma total de todos os argumentos em todas as invocações.

Abaixo encontra-se uma solução parcial, que requer uma invocação final com nenhum argumento.

/**
 * @description
 * infiniteAdd(2,3)(4,5)(6,7)()
 * Above operation yields 27
 */

function infiniteAdd() {
  // Creating closure for subsequent function invocations
  var prevArgs = Array.prototype.slice.call(arguments);

  return function() {
    var currArgs = Array.prototype.concat.call(prevArgs, Array.prototype.slice.call(arguments));

    if (arguments.length < 1) {
      // if no arguments than calculate sum
      return Array.prototype.reduce.call(currArgs,
        function(acc, curr) {
          return acc + curr;
        }
      );
    }
    
    // Recursively call the main function till no more arguments provided
    return infiniteAdd.apply(null, currArgs);
  }
}

console.log(infiniteAdd(2, 3)(4, 5)(6, 7)());

Publicado 27/11/2018 em 18:04
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Você pode implementar a função currying para adição como abaixo

function addition(...args) {
  return args.reduce((a, b) => a + b)
}

function parseAdd(fn) {
  var newFn = fn.bind(null);

  function cal(...args) {
    newFn = newFn.bind(null, ...args);
    return cal;
  }

  cal.toString = () => newFn();

  return (...arg) => {
    newFn = fn.bind(null);
    return cal(...arg)
  }
}

var add = parseAdd(addition)

console.log(add(2, 3, 4)(5, 6)(7, 8))

Respondeu 27/11/2018 em 18:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more