Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

184
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!