Técnica avanzada para trabajar con programación funcional en 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.
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);
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' }]
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.