Currying en JavaScript

Técnica avanzada para trabajar con programación funcional en JavaScript.

currying-javascript

Currying es una técnica de programación funcional que consiste en transformar una función de múltiples argumentos a una sequencia de funciones, cada una de un solo argumento. Es más sencillo de lo que parece. Veamos un ejemplo:

function sumar(a) {
return function(b) {
return function(c) {
return a + b + c;
}
}
}
// La función también se puede escribir así
// const sumar = a => b => c => a + b + c;
console.log(sumar(1, 2, 1)); // Resultado: 5

La función sumar acepta un parámetro a y retorna una función. Esta función acepta otro parámetro b que al ejecutarse retorna otra función que acepta otro parámetro c que al ejecutarse finalmente retorna el resultado a + b + c.

El término currying hace referencia al lógico Haskell Curry (1900-1982) que popularizó el concepto en 1930. La técnica es muy usada en matemáticas y programación funcional.

¿Qué utilidad tiene Currying?

El concepto de currying permite derivar nuevas funciones a partir de una existente y permite reusar código. Por ejemplo:

const resultadoParcial = sumar(1);

resultadoParcial es una constante que como resultado de ejecutar sumar, guarda la función retornada en la variable. Podemos reusar esta función en el futuro sin tener que volver a ejecutarla. Por si solo, esto ya es un beneficio puesto que nos ahorramos computar de nuevo la función y además podemos componer el resultado de esta fución con otras:

const otroResultadoParcial = resultadoParcial(1);

Un ejemplo más completo

Veamos un ejemplo más real. Trataremos de filtrar una colección de datos usando funciones parciales que luego compondremos para obtener resultados:

const filtrarPor = (propiedad) => (valor) => (array) => {
return array.filter(elemento => elemento[propiedad] === valor);
};
const usuarios = [
{ id: 1, name: 'Alice', role: 'admin' },
{ id: 2, name: 'Bob', role: 'usuario' },
{ id: 3, name: 'Charlie', role: 'usuario' },
{ id: 4, name: 'Diana', role: 'admin' }
];
const filtrarPorRol = filtrarPor('role');
const getAdmins = filtrarPorRol('admin');
const getUsuarios = filtrarPorRol('usuario');
console.log(getAdmins(usuarios)); // [{ id: 1, name: 'Alice', role: 'admin' }, { id: 4, name: 'Diana', role: 'admin' }]
console.log(getUsuarios(usuarios)); // [{ id: 2, name: 'Bob', role: 'usuario' }, { id: 3, name: 'Charlie', role: 'usuario' }]

Conclusión

Currying es útil para escribir código más genérico y abstracto, al reducir funciones a funciones parciales, facilitas la composición de funcionalidades.

Aunque quizá no es una técnica muy utilizada en el día a día, si que vale la pena conocer el término y saber identificar este tipo de funciones. Además en entrevistas de trabajo para programadors JavaScript es una pregunta que suele preguntarse.