Currying en JavaScript: ¿Qué es y cómo usar? Ejemplos.

El currying en JavaScript es una técnica que transforma funciones para hacerlas más reutilizables y flexibles. ¿Qué hace exactamente y para qué sirve? Permite descomponer una función en varias más pequeñas que reciben un argumento a la vez. Aprende qué es, cómo usarlo y ve un ejemplo práctico que te ayudará a dominar esta poderosa herramienta.

currying en javascript

1. ¿Qué es el Currying en JavaScript?

El currying en JavaScript es una técnica de programación funcional en la que una función con múltiples parámetros se transforma en una secuencia de funciones unarias (que toman un solo argumento cada uno). Recomiendo ver que son los parámetros y argumentos en JS.

En otras palabras….

En lugar de llamar a una función con todos los argumentos de una vez, se llama a una serie de funciones, cada una con un solo parámetro, hasta que se obtiene el resultado final.

  1. Ejemplo de Currying:
  2. ¿Qué ventajas nos da usar una función curry en vez de una función normal?
  3. ¿Se puede escribir esta función curry de una manera menos compleja?

1.1. Ejemplo de Currying:

Supongamos que tenemos una función normal en JS que suma tres números:

function suma(a, b, c) {
  return a + b + c;
}

console.log(suma(1, 2, 3)); // Salida: 6Lenguaje del código: JavaScript (javascript)

Si aplicamos currying, la función se convierte en una serie de funciones anidadas:

function currySuma(a) {
  return function(b) {
    return function(c) {
      return a + b + c;
    };
  };
}

console.log(currySuma(1)(2)(3)); // Salida: 6Lenguaje del código: JavaScript (javascript)

🔍 ¿Que sucede aquí?

  1. PASO 1: Definición de la función currySuma:
    • currySuma(a): Es una función que toma un parámetro a y devuelve otra función.
    • La función anidada function(b) {...}: Toma un segundo parámetro b y devuelve otra función.
    • La segunda función anidada function(c) {...}: Toma el tercer parámetro c y finalmente devuelve la suma de a + b + c.

NOTA! Antes del currying, la función tiene múltiples parámetros. Después del currying, cada función generada solo recibe un argumento a la vez.

  1. PASO 2: Llamada a la función: console.log(currySuma(1)(2)(3)); // Salida: 6
    • Primera llamada: currySuma(1)
      • Se ejecuta function(a) { return function(b) {...} } con a = 1, devolviendo una nueva función: function(b) {...}
    • Segunda llamada: (2)
      • Ahora, llamamos a la función devuelta en el paso anterior con b = 2.
      • Y devuelve otra función que espera c.
    • Tercera llamada: (3)
      • Finalmente, llamamos a la última función con c = 3. Ahora sí, se evalúa la suma: return 1 + 2 + 3; // Resultado final: 6

📌 ¿Cuál es la principal diferencia con una función tradicional?

La diferencia clave es que en la versión con currying no pasamos todos los parámetros de una sola vez, sino que cada función devuelve otra función que espera el siguiente argumento.

NOTA!!!! Si te animas y deseas ver el resultado de este ejemplo y de todos los que iremos proporcionando directamente desde tu PC, te invito a seguir estos pasos.

  1. Primero, revisa el punto 5 del siguiente artículo sobre como usar e instalar VSCode (este es el editor de código mas usado), donde encontrarás los pasos para crear la estructura necesaria para visualizar una página desde tu navegador predeterminado.
  2. Si entendiste correctamente este paso anterior, sabrás donde colocar el código script que te acabamos de proporcionar (arriba). Ahora, puedes visualizar el resultado, para ello puedes hacer lo siguiente:
    • Una vez abierta y visualizada la página, abre la consola del navegador presionando la tecla F12.
    • Ahora, dirígete a la pestaña que dice Console, y desde aquí podrás ver el resultado del script que hayamos introducido anteriormente.
  3. No te preocupes, estos pasos son más simples de lo que parecen!!!! Entonces… cada vez que dejemos un código de ejemplo como éste, puedes seguir estos pasos y ver los resultados por ti mismo. ¡Ojalá te animes!!!!

Link para descargar el editor de código Visual Studi Code!!

1.2. ¿Qué ventajas nos da usar una función curry en vez de una función normal?

Siguiendo el ejemplo del punto anterior, aquí dejamos algunos beneficios de usar el curryIng:

1.2.1. Reutilización de funciones:

El currying nos permite reutilizar una función con algunos valores ya establecidos.

🚀 EJEMPLO: Crear una función con un valor fijo

Si queremos hacer varias sumas pero siempre empezando con el mismo número (ejemplo: 10), podemos hacer esto:

function currySuma(a) {
  return function(b) {
    return function(c) {
      return a + b + c;
    };
  };
}


const sumaBase10 = currySuma(10); // Fijamos 'a' como 10
console.log(sumaBase10(2)(3)); // 15
console.log(sumaBase10(5)(1)); // 16Lenguaje del código: JavaScript (javascript)

📌 Aquí, al llamar a la función con console.log(sumaBase10(2)(3)); sucede lo siguiente:

  1. Primero, se guardo currySuma(10) en la variable sumabase10 para su reutilización, y fijamos el valor del parámetro a = 10 y devuelve una función que espera b.
  2. Ahora, sumaBase10(2) fija b = 2 y devuelve otra función que espera c.
  3. Y sumaBase10(2)(3) ahora recibe c = 3 y retorna 10 + 2 + 3 = 15.

📌 Ejemplo con otra llamada: console.log(sumaBase10(5)(1));

  • sumaBase10(5)(1) fija b = 5, luego c = 1, y retorna 10 + 5 + 1 = 16.

📌 ¿Qué ventaja nos da esto?

Si usáramos la versión normal de la función, tendríamos que escribir suma(10, 2, 3) o suma(10, 5, 1), en lugar de simplemente reutilizar sumaBase10.

1.2.2. Modularidad y composición de funciones:

El currying nos ayuda a dividir una tarea en pequeñas funciones reutilizables.

🚀 EJEMPLO: Crear una función intermedia

Podemos definir funciones que representen cada paso del currying:

const suma1 = currySuma(1); // Fijamos el primer número como 1
const suma1y2 = suma1(2); // Ahora fijamos el segundo número como 2
console.log(suma1y2(3)); // 6
console.log(suma1y2(5)); // 8Lenguaje del código: JavaScript (javascript)

Siguiendo la función curry del ejemplo 1.1., aquí sucede lo siguiente:

  1. const suma1 = currySuma(1);
    • En la variable suma1, guardamos la función curry currySuma(1); donde asignamos fijamente el valor del parámetro a = 1.
  2. const suma1y2 = suma1(2);
    • Aquí sucede lo mismo, asignamos fijamente el valor del parámetro b = 2 con suma1(2);. Y guardamos esta acción en la variable const suma1y2 para su reutilización.
  3. console.log(suma1y2(3)); // 6
    • Aquí, llamamos a la función, y como en suma1y2 ya están implícitamente asignados los valores para los parámetros a y b, entonces con (3), estamos asignando el valor para el parámetro c, produciendo la suma de 1 + 2 + 3 = 6
  4. console.log(suma1y2(5)); // 8
    • Aquí, sucede lo mismo, solo que cambiamos el valor para c con (5), produciendo la suma de 1 + 2 + 5 = 8.

📌 ¿Qué ventaja nos da esto?

Podemos reutilizar suma1 para sumar siempre partiendo de 1 o suma1y2 para sumar siempre partiendo de 1 y 2. Si usáramos la versión normal de la función, tendríamos que escribir suma(1, 2, 3) y suma(1, 2, 5) cada vez.

1.2.3. Facilidad en la composición de funciones

El currying se usa mucho en programación funcional porque nos permite combinar funciones más fácilmente.

🚀 EJEMPLO: Composición con map

Imagina que tenemos un array de números y queremos sumarles 5 a cada uno:

const suma5 = currySuma(5); // Fijamos el primer número como 5
const suma5y3 = suma5(3); // Fijamos el segundo número como 3

const numeros = [1, 2, 3, 4];

const resultado = numeros.map(suma5y3); // Como falta el tercer número, se lo pasamos en map

console.log(resultado); // [9, 10, 11, 12]Lenguaje del código: JavaScript (javascript)

Siguiendo la función curry del ejemplo 1.1., aquí sucede lo siguiente:

  1. const suma5 = currySuma(5);
    • Aquí guardamos una función parcial en la variable suma5, fijando a = 5. Ahora suma5 es una función que espera b.
  2. const suma5y3 = suma5(3);
    • Ahora fijamos b = 3, por lo que suma5y3 es una función que espera c.
  3. const numeros = [1, 2, 3, 4];
    • Creamos un array de números que serán usados en el siguiente paso.
  4. const resultado = numeros.map(suma5y3);
    • Aquí map llama a suma5y3 pasando cada número del array como c. Como suma5y3 ya tiene a = 5 y b = 3, lo único que falta es c, que toma los valores 1, 2, 3, 4.
    • Podríamos ver el resultado de esta acción en la siguiente tabla:
Valor de cCálculo (5 + 3 + c)Resultado
15 + 3 + 19
25 + 3 + 210
35 + 3 + 311
45 + 3 + 412
  1. console.log(resultado); // [9, 10, 11, 12]
    • Imprime el array resultante con las sumas ya calculadas.

📌 ¿Qué ventaja nos da esto?

Con una función normal, habríamos tenido que escribir una función anónima dentro de map, haciendo el código menos limpio. (suma5 es una función general que podemos usar en otros casos. suma5y3 es aún más específica y lista para usarse).

1.2.4. Mayor claridad en la separación de parámetros

A veces, no conocemos todos los valores de inmediato. Con currying, podemos pasar los valores uno por uno, en vez de pasarlos todos juntos.

🚀 EJEMPLO: Datos ingresados en diferentes momentos

Supongamos que en una aplicación primero pedimos un número base, luego otro, y después otro.

const paso1 = currySuma(4); // El usuario ingresa 4
console.log("Número base:", 4);

const paso2 = paso1(6); // Más tarde ingresa 6
console.log("Siguiente número:", 6);

const resultadoFinal = paso2(8); // Finalmente ingresa 8
console.log("Resultado final:", resultadoFinal); // 18Lenguaje del código: JavaScript (javascript)

Siguiendo la función curry del ejemplo 1.1., aquí sucede lo siguiente:

1️⃣ // El usuario ingresa 4

const paso1 = currySuma(4); // El usuario ingresa 4
console.log("Número base:", 4);Lenguaje del código: JavaScript (javascript)
  • Aquí llamamos a currySuma(4), fijando a = 4.
  • paso1 ahora es una función que espera b.
  • Se imprime: «Número base: 4».

2️⃣ // Más tarde ingresa 6

const paso2 = paso1(6); // Más tarde ingresa 6
console.log("Siguiente número:", 6);Lenguaje del código: JavaScript (javascript)
  • Aquí llamamos a paso1(6), fijando b = 6.
  • paso2 ahora es una función que espera c.
  • Se imprime: «Siguiente número: 6».

3️⃣ // Finalmente ingresa 8

const resultadoFinal = paso2(8); // Finalmente ingresa 8
console.log("Resultado final:", resultadoFinal); // 18Lenguaje del código: JavaScript (javascript)
  • Aquí llamamos a paso2(8), fijando c = 8.
  • Ahora se ejecuta la operación final: 4 + 6 + 8 = 18.
  • resultadoFinal almacena 18.
  • Se imprime: «Resultado final: 18».

1.3. ¿Se puede escribir esta función curry de una manera menos compleja?

Como vimos en el ejemplo 1.2., tanto la función normal o tradicional como la función curry tienen el mismo resultado, aunque la función curry, como se observa en el ejemplo, es algo mas compleja de escribir (aunque nos brinda algunas ventajas).

Para hacerla menos compleja pero con los mismos beneficios, podemos usar una función flecha (arrow) como la siguiente:

const currySuma = (a) => (b) => (c) => a + b + c;

console.log(currySuma(1)(2)(3)); // Salida: 6Lenguaje del código: JavaScript (javascript)

Aquí estamos usando funciones flecha para eliminar la palabra function y hacer el código más conciso.

2. ¿Para qué se utiliza el currying en JavaScript?

Si bien, en el punto 1.2. al nombrar su ventajas ya dijimos varios de sus usos con ejemplo (que creemos son claros), aquí dejamos una ampliación de sus usos y casos prácticos en los que se usan:

  1. Reutilización de funciones
  2. Facilita la composición de funciones
  3. Uso con métodos de arrays (map, filter, reduce)
  4. Código más modular y legible
  5. Conclusión

2.1. Reutilización de funciones

Permite fijar valores parciales y reutilizar la misma función con diferentes valores restantes.

🎯 EJEMPLO DE USO PRÁCTICO:

  • En una tienda online, se puede fijar un impuesto base y luego calcular el precio final para distintos productos sin repetir la lógica del cálculo del impuesto.
  • Un sistema de descuentos donde se fija un porcentaje y se aplica a diferentes productos.

2.2. Facilita la composición de funciones

Permite dividir funciones complejas en pasos más pequeños y combinarlas fácilmente.

🎯 EJEMPLO DE USO PRÁCTICO:

  • En una aplicación de notificaciones, se puede crear una función que reciba primero el tipo de mensaje (informativo, error, éxito) y luego aplicar estilos y contenido según el caso.
  • En un sistema de gestión de usuarios, se puede definir una función que fije un rol (administrador, editor, usuario) y luego asignarle permisos específicos.

2.3. Uso con métodos de arrays (map, filter, reduce)

Permite aplicar funciones parcialmente configuradas dentro de métodos de arrays, haciendo el código más limpio y reutilizable.

🎯 EJEMPLO DE USO PRÁCTICO:

  • En un sistema de facturación, se puede fijar un porcentaje de IVA y aplicarlo a una lista de precios sin definir manualmente cada cálculo.
  • En una aplicación de ventas, se puede filtrar una lista de productos fijando un rango de precios y luego aplicar diferentes descuentos según el caso.

2.4. Código más modular y legible

Hace que el código sea más estructurado y fácil de entender, ya que separa funciones en pasos más manejables.

🎯 EJEMPLO DE USO PRÁCTICO:

  • En una aplicación de traducción, se puede fijar un idioma de destino y luego traducir diferentes palabras o frases en distintos momentos.
  • En un chatbot, se puede fijar una categoría de respuesta (saludos, información, soporte) y luego definir respuestas específicas según la conversación del usuario.

2.5. Conclusión

El currying es útil en la práctica para:
Evitar repetición de código en cálculos como impuestos o descuentos.
Organizar la lógica en sistemas de usuarios, notificaciones o permisos.
Hacer el código más reutilizable en operaciones con listas como filtrado de productos o cálculo de precios.
Facilitar la integración con funciones de orden superior en procesamiento de datos y transformación de arrays.

3. ¿Cómo hacer una función curry en JavaScript?

Aquí veremos como hacer una función curry de estas dos maneras:

  1. Crear una función curried con el método manual. Paso a paso:
  2. Crear una función curried usando una arrow functions (función flecha). Paso a paso

3.1. Crear una función curried con el método manual. Paso a paso:

Este enfoque te permitirá comprender en profundidad el concepto de currying y cómo implementarlo sin depender de bibliotecas externas.

PASO 1: Define la función original

Comienza definiendo la función que deseas convertir en curried. Esta función debe aceptar múltiples parámetros. Por ejemplo, vamos a crear una función llamada multiplicar que toma dos números y devuelve su producto:

function multiplicar(a, b) {
  return a * b;
}
Lenguaje del código: JavaScript (javascript)

PASO 2: Crea la función curried

Ahora, vamos a crear la función curried correspondiente. Esta función debe aceptar un parámetros a la vez y devolver una nueva función que espere el siguiente parámetro. Para lograr esto, utilizaremos funciones anidadas.

function multiplicarCurry(a) {
  return function(b) {
    return multiplicar(a, b);
  };
}
Lenguaje del código: JavaScript (javascript)

En este caso, multiplicarCurry es la función curried. Cuando la llamas con el primer argumento (a), devuelve una nueva función que espera el segundo argumento (b). Esta función interna, a su vez, llama a la función original multiplicar con ambos argumentos y devuelve el resultado.

PASO 3: Utiliza la función curried

Para utilizar la función curried, primero debes llamarla con el primer argumento. Esto te devolverá una nueva función que «recuerda» el primer argumento. Luego, puedes llamar a esta nueva función con el segundo argumento para obtener el resultado final.

const multiplicarPor5 = multiplicarCurry(5); // Crea una función que multiplica por 5
const resultado = multiplicarPor5(3); // Multiplica 5 por 3
console.log(resultado); // Imprime 15
Lenguaje del código: JavaScript (javascript)

En este ejemplo, multiplicarPor5 es una función especializada que siempre multiplica por 5. Esto demuestra cómo el currying nos permite crear funciones más específicas y reutilizables a partir de funciones generales.

CONCLUSIÓN:

El método manual de currying te permite comprender cómo funciona esta técnica y cómo implementarla en JavaScript. Si bien puede requerir un poco más de código, te brinda un mayor control y comprensión del proceso.

3.2. Crear una función curried usando una arrow functions (función flecha). Paso a paso

Este enfoque te permitirá escribir código más conciso y expresivo, aprovechando las ventajas de las arrow functions.

PASO 1: Define la función original

Comienza definiendo la función que deseas convertir en curried. Esta función debe aceptar múltiples parámetros. Utilizaremos el mismo ejemplo de la función multiplicar que toma dos números y devuelve su producto:

const multiplicar = (a, b) => a * b;Lenguaje del código: JavaScript (javascript)

PASO 2: Crea la función curried con arrow functions

Ahora, vamos a crear la función curried correspondiente utilizando arrow functions. Esta función debe aceptar un parámetro a la vez y devolver una nueva función que espere el siguiente parámetro.

const multiplicarCurry = a => b => multiplicar(a, b);Lenguaje del código: JavaScript (javascript)

En este caso, multiplicarCurry es la función curried. Cuando la llamas con el primer argumento (a), devuelve una nueva función (definida con la segunda arrow function) que espera el segundo argumento (b). Esta función interna, a su vez, llama a la función original multiplicar con ambos argumentos y devuelve el resultado.

PASO 3: Utiliza la función curried

Para utilizar la función curried, primero debes llamarla con el primer argumento. Esto te devolverá una nueva función que «recuerda» el primer argumento. Luego, puedes llamar a esta nueva función con el segundo argumento para obtener el resultado final.

const multiplicarPor5 = multiplicarCurry(5); // Crea una función que multiplica por 5
const resultado = multiplicarPor5(3); // Multiplica 5 por 3
console.log(resultado); // Imprime 15
Lenguaje del código: JavaScript (javascript)

En este ejemplo, multiplicarPor5 es una función especializada que siempre multiplica por 5. Esto demuestra cómo el currying nos permite crear funciones más específicas y reutilizables a partir de funciones generales.

CONCLUSIÓN:

El uso de arrow functions para crear funciones curried en JavaScript te permite escribir código más conciso y legible. Este enfoque es especialmente útil cuando trabajas con funciones simples que se pueden expresar de forma compacta.

4. Desventajas y cuándo NO usar Currying en JavaScript.

El currying es una técnica útil en muchos casos, pero abusar de él puede hacer que el código sea menos claro, más difícil de depurar y hasta afectar el rendimiento.

Aquí te explico las principales desventajas con ejemplos prácticos.

  1. Desventajas del currying.
  2. ¿Cuándo NO usar Currying?

4.1. Desventajas del currying.

4.1.1. Código poco legible si se abusa del Currying.

El currying mejora la reutilización, pero si se usa en exceso, el código se vuelve difícil de leer y comprender.

🔴 EJEMPLO: Código con abuso de currying:
const operacion = a => b => c => d => e => a + b * c - d / e;

console.log(operacion(2)(3)(4)(5)(6)); // 🤯 ¿Qué está pasando aquí?Lenguaje del código: JavaScript (javascript)

Explicación:

  • Este código tiene demasiadas funciones anidadas, lo que hace difícil entender qué está pasando.
  • No es claro qué valores se están pasando en cada llamada.
  • Si olvidamos un argumento, puede generar errores difíciles de detectar.
✅ Alternativa más legible sin currying:
function operacion(a, b, c, d, e) {
  return a + b * c - d / e;
}

console.log(operacion(2, 3, 4, 5, 6)); // 13.166...Lenguaje del código: JavaScript (javascript)

✔️ Más claro y fácil de entender.
✔️ Se pueden usar valores predeterminados (default parameters) si es necesario.

4.1.2. Mayor cantidad de funciones anidadas dificulta la depuración

Cuando se usa currying en exceso, rastrear errores es complicado, especialmente si la función se usa en varias partes del código.

🔴 EJEMPLO: Código con currying difícil de depurar:
const dividir = a => b => b === 0 ? "Error: División por cero" : a / b;

const dividirEntre5 = dividir(10);

console.log(dividirEntre5(2)); // 5
console.log(dividirEntre5(0)); // Error, pero ¿dónde?Lenguaje del código: JavaScript (javascript)

Explicación:

  • Si hay un error (por ejemplo, división por cero), el mensaje de error no indica claramente qué función lo causó.
  • Si estamos en un código más grande, es difícil saber dónde se originó el problema.
✅ Alternativa más depurable:
function dividir(a, b) {
  if (b === 0) throw new Error("Error: División por cero");
  return a / b;
}

try {
  console.log(dividir(10, 2)); // 5
  console.log(dividir(10, 0)); // Lanza un error que podemos rastrear
} catch (error) {
  console.error(error.message);
}Lenguaje del código: JavaScript (javascript)

✔️ Ventaja: Podemos capturar y manejar errores con try-catch.
✔️ El stack trace mostrará dónde ocurrió el error.

4.1.3. No siempre mejora el rendimiento si se aplica sin necesidad

En JavaScript, cada función crea un closure, lo que significa que almacena en memoria el estado de su contexto. Si abusamos del currying, podemos afectar el rendimiento.

🔴 EJEMPLO: Código con currying innecesario:
const multiplicar = a => b => c => a * b * c;

const por2 = multiplicar(2); // Se guarda en memoria
const por2y3 = por2(3); // Se guarda en memoria

console.log(por2y3(4)); // 24
console.log(por2y3(5)); // 30Lenguaje del código: JavaScript (javascript)

Explicación:

  • Se están creando múltiples funciones en memoria.
  • Si la operación es simple, el currying no aporta ninguna ventaja.
✅ Alternativa más eficiente sin currying:
function multiplicar(a, b, c) {
  return a * b * c;
}

console.log(multiplicar(2, 3, 4)); // 24
console.log(multiplicar(2, 3, 5)); // 30Lenguaje del código: JavaScript (javascript)

✔️ Menos consumo de memoria.
✔️ Más rápido y directo.

4.2. ¿Cuándo NO usar Currying?

🚫 Si la función no se reutiliza con parámetros fijos.
🚫 Si complica más de lo que ayuda.
🚫 Si genera closures innecesarios y consume memoria.

📌 CONCLUSIÓN:

El currying es una técnica poderosa, pero debe usarse con moderación. Si dificulta la legibilidad, la depuración o afecta el rendimiento, es mejor usar funciones normales con múltiples parámetros.

5. ¿Existen librerías o herramientas que faciliten el uso de currying en JavaScript?

Sí, existen librerías y herramientas que facilitan el uso de currying en JavaScript, ayudando a escribir código más limpio y funcional.

Algunas de las más populares son:

  1. Lodash (_.curry)
  2. Ramda (R.curry)
  3. Sanctuary (S.curry2, S.curry3)
  4. Conclusión: ¿Cuál librería elegir?

5.1. Lodash (_.curry)

Lodash es una de las librerías más utilizadas para programación funcional en JavaScript. Su método _.curry transforma una función para que pueda recibir argumentos en múltiples llamadas parciales.

5.1.1. Ejemplo: Currying con _.curry en Lodash

const _ = require("lodash");

const suma = (a, b, c) => a + b + c;

// Convertimos la función en una versión curriada
const curriedSuma = _.curry(suma);

console.log(curriedSuma(1)(2)(3)); // 6
console.log(curriedSuma(1, 2)(3)); // 6
console.log(curriedSuma(1)(2, 3)); // 6Lenguaje del código: JavaScript (javascript)

Explicación:

  1. _.curry(suma): Convierte la función normal en una función curriada.
  2. Se pueden pasar los argumentos uno por uno (curriedSuma(1)(2)(3)) o parcialmente (curriedSuma(1,2)(3)).
  3. Cuando la función recibe todos los argumentos, se ejecuta.

Ventaja: Facilita la aplicación parcial de funciones sin escribir manualmente funciones anidadas.

5.2. Ramda (R.curry)

Ramda es otra librería funcional muy popular, con una implementación de curry similar a Lodash.

5.2.1. Ejemplo: Currying con R.curry en Ramda

const R = require("ramda");

const multiplicar = (a, b, c) => a * b * c;

// Convertimos la función en una versión curriada
const curriedMultiplicar = R.curry(multiplicar);

console.log(curriedMultiplicar(2)(3)(4)); // 24
console.log(curriedMultiplicar(2, 3)(4)); // 24
console.log(curriedMultiplicar(2)(3, 4)); // 24Lenguaje del código: JavaScript (javascript)

Explicación:

  1. R.curry(multiplicar): Convierte la función en una versión curriada.
  2. Se pueden pasar los argumentos de manera flexible.
  3. Es similar a Lodash, pero Ramda se enfoca más en la inmutabilidad y composición funcional.

Ventaja: Diseñada para composición funcional y funciona bien con R.compose.

5.3. Sanctuary (S.curry2, S.curry3)

Sanctuary es una librería funcional estrictamente tipada que usa currying por defecto.

5.3.1. Ejemplo: Currying con S.curry2 en Sanctuary

const S = require("sanctuary");

// Definimos una función que suma dos números
const suma = S.curry2((a, b) => a + b);

console.log(suma(5)(10)); // 15
console.log(suma(5, 10)); // 15Lenguaje del código: JavaScript (javascript)

Explicación:

  1. S.curry2(f) convierte f en una función curriada de 2 argumentos.
  2. Se pueden pasar los argumentos uno por uno o ambos a la vez.
  3. Sanctuary impone tipado estricto, lo que mejora la seguridad en el código.

Ventaja: Es ideal para programación funcional con tipos estrictos.

5.4. Conclusión: ¿Cuál librería elegir?

🔹 Lodash (_.curry)Mejor opción si ya usas Lodash en tu proyecto.
🔹 Ramda (R.curry)Ideal para composición funcional y código más declarativo.
🔹 Sanctuary (S.curry2)Si quieres un enfoque más seguro y estrictamente tipado.

💡 Si usas muchas funciones curriadas, Ramda es una excelente opción por su flexibilidad.

6. Currying en JavaScript y WordPress.

6.1. ¿Si tengo una web en WordPress, se usa normalmente el currying con JS para su desarrollo ?

No es común usar currying en el desarrollo de una web hecha con WordPress y Gutenberg, ya que WordPress se basa en PHP para el backend y usa JavaScript principalmente para la interfaz de usuario.

Sin embargo, si estás creando bloques personalizados con React (que Gutenberg usa internamente), podrías aplicar currying en situaciones como:

Manejo de eventos: Para crear funciones reutilizables que manejen eventos de manera flexible.
Configuración de propiedades: Para preconfigurar opciones de un bloque sin necesidad de repetir código.
Optimización de código: Para mejorar la composición de funciones en lógica de estado o efectos secundarios con useEffect o useCallback.

Si solo usas JavaScript vanilla para scripts personalizados en WordPress, el currying no suele ser necesario.

6.2. ¿Qué podría hacer con currying y mi web creada con WordPress – Gutenberg?

Sí, en tu web hecha con WordPress y Gutenberg, podrías aplicar currying en JavaScript en los siguientes casos:

6.2.1. Manejo de eventos en bloques personalizados

Si creas un bloque de Gutenberg con React, podrías usar currying para manejar eventos como clics o cambios de entrada, permitiendo reutilizar funciones con diferentes configuraciones.

🔹 EJEMPLO PRÁCTICO:
Un botón en un bloque que ejecuta diferentes acciones según el tipo de usuario (admin, editor, visitante).

6.2.2. Generación dinámica de estilos

Si necesitas aplicar estilos condicionales a bloques de Gutenberg, podrías usar currying para preconfigurar funciones que asignen clases CSS según ciertos criterios.

🔹 EJEMPLO PRÁCTICO:
Un bloque que cambia de color según la categoría del post o la configuración del usuario.

6.2.3. Creación de Hooks personalizados

Cuando usas React en Gutenberg, podrías usar currying para crear hooks reutilizables con configuraciones específicas.

🔹 EJEMPLO PRÁCTICO:
Un hook para gestionar formularios en bloques personalizados, donde cada campo tenga una validación diferente.

6.2.4. Manipulación de contenido en bloques

Si necesitas transformar el contenido de los bloques dinámicamente, podrías usar currying para aplicar funciones de procesamiento de datos de manera más flexible.

🔹 EJEMPLO PRÁCTICO:
Un bloque que formatea automáticamente los títulos en mayúsculas o agrega prefijos según la sección de la web.

6.2.5. Optimización de carga de scripts

Si tienes scripts personalizados que se cargan en diferentes secciones de la web, podrías usar currying para modularizar y reutilizar la lógica según el tipo de página.

🔹 EJEMPLO PRÁCTICO:
Un script que muestra una alerta diferente según si el usuario está en el home, en un post o en una página de contacto.

🔹 Otro caso:
Un código que configura diferentes opciones de animaciones en bloques de Gutenberg dependiendo del viewport o de la interacción del usuario.

CONCLUSIÓN:

Si bien el currying no es esencial en WordPress, puede ayudarte a modularizar y optimizar ciertas partes de la lógica en tus bloques personalizados con JavaScript y React dentro de Gutenberg.

7. Preguntas frecuentes y resumen sobre currying en JS.

El currying es una técnica que transforma una función con múltiples argumentos en una serie de funciones unarias. Se usa para reutilizar funciones, mejorar la composición funcional y hacer código más flexible y modular.

El currying convierte una función que recibe varios argumentos en una cadena de funciones que reciben un argumento cada una. Solo cuando se reciben todos los argumentos, la función ejecuta su lógica.

Facilita la reutilización de funciones, la composición funcional y la modularidad del código. Permite crear funciones especializadas a partir de una función más genérica y mejora la legibilidad.

Es útil en programación funcional, composición de funciones, creación de configuraciones reutilizables y en la personalización de funciones sin modificar su estructura original.

Se puede crear una función curriada manualmente usando closures o con una función genérica que aplica currying, como: const curry = fn => (...args) => args.length >= fn.length ? fn(...args) : (...next) => curry(fn)(...args, ...next);.

El currying siempre descompone una función en llamadas unarias, mientras que la aplicación parcial permite fijar algunos argumentos sin necesidad de ser estrictamente unaria.

Sí, librerías como Lodash (_.curry), Ramda (R.curry) y Sanctuary (S.curry2) facilitan la currificación. Permiten transformar funciones en versiones curriadas para mejorar la composición y reutilización.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *