Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

185
Visualizações
¿Cómo implementar valores de suma de curry infinitos con una función de devolución de llamada con resultado en javascript?

Tengo una prueba donde necesito implementar una función de alto orden llamada sum en este caso que cumple con los siguientes requisitos:

 sum(result => {console.log("-> ", result)});// -> prints: -> 0 sum(1)(result => {console.log("-> ", result)});// -> prints: -> 1 sum(1)(2)(result => {console.log("-> ", result)});// -> prints: -> 3 sum(1)(2)(4)(result => {console.log("-> ", result)});// -> prints: -> 7

Hice una función para obtener el curry infinito con recursividad, pero estoy un poco perdido con la función de devolución de llamada.

 let sum = a => !a ? 0 : b => b ? sum(a+b) : a console.log(sum()) -> 0 console.log(sum(1)()) -> 1 console.log(sum(1)(2)()) -> 3 console.log(sum(1)(2)(4)()) -> 7
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Utilice un cierre para acumular la suma. Una función interna llamará a la devolución de llamada con la suma cuando detecte que el argumento es una función. De lo contrario, se devolverá solo después de adaptar la suma:

 function sum(arg) { let total = 0; function inner(arg) { if (typeof arg === "function") { arg(total); } else { total += arg; return inner; } } return inner(arg); } sum(result => {console.log("-> ", result)});// -> prints: -> 0 sum(1)(result => {console.log("-> ", result)});// -> prints: -> 1 sum(1)(2)(result => {console.log("-> ", result)});// -> prints: -> 3 sum(1)(2)(4)(result => {console.log("-> ", result)});// -> prints: -> 7

Si no se pretende que la función mantenga el estado, puede usar this argumento para pasar el total:

 "use strict"; function sum(arg) { function inner(arg) { if (typeof arg === "function") { arg(+this); } else { return inner.bind(this + arg); } } return inner.call(0, arg); } sum(result => {console.log("-> ", result)});// -> prints: -> 0 sum(1)(result => {console.log("-> ", result)});// -> prints: -> 1 sum(1)(2)(result => {console.log("-> ", result)});// -> prints: -> 3 sum(1)(2)(4)(result => {console.log("-> ", result)});// -> prints: -> 7 const foo = sum(0); foo(100)(console.log); // 100 foo(1)(console.log); // 1

Aquí se recomienda el modo estricto, pero también funcionará en el modo descuidado. En ese caso, this argumento se encuadra y se desencuadra nuevamente.

about 4 years ago · Juan Pablo Isaza Relatório

0

Para simplificar, puede tener una función auxiliar que acepte dos argumentos. El primer argumento es un número. El segundo argumento sería un número o función y, según el tipo, haría cosas diferentes:

  • cuando es una función, la ejecutará y le pasará el primer argumento.
  • cuando es un número, sumará los dos argumentos y los pasará como el primer argumento del asistente. La próxima vez, el primer argumento contendrá el nuevo total.

De esta manera, puede configurar una cadena continua de ejecución curry que finaliza cuando se pasa una función como argumento.

La función sum() real puede usar el asistente e inicializar el inicio de la cadena al establecer el primer argumento en 0 , el elemento neutral para la operación de suma:

 const helper = total => arg => { if (typeof arg === "function") arg(total); else if (typeof arg === "number") return helper(total + arg); else throw new Error("invalid argument"); } const sum = x => helper(0)(x); sum(result => {console.log("-> ", result)});// -> prints: -> 0 sum(1)(result => {console.log("-> ", result)});// -> prints: -> 1 sum(1)(2)(result => {console.log("-> ", result)});// -> prints: -> 3 sum(1)(2)(4)(result => {console.log("-> ", result)});// -> prints: -> 7

Para simplificar, la función helper() está currada.


Aquí hay una versión más concisa:

  • asume que solo se pasará el número o la función.
  • La definición de sum() ha sido eta-reducida.

 const helper = total => arg => (typeof arg === "function") ? arg(total) : helper(total + arg); const sum = helper(0); sum(result => {console.log("-> ", result)});// -> prints: -> 0 sum(1)(result => {console.log("-> ", result)});// -> prints: -> 1 sum(1)(2)(result => {console.log("-> ", result)});// -> prints: -> 3 sum(1)(2)(4)(result => {console.log("-> ", result)});// -> prints: -> 7

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda