Composição de funções
Compor é combinar funções simples para formar uma mais complexa: a saída de uma é a entrada da seguinte.
const dobro = (n) => n * 2;
const incrementar = (n) => n + 1;
const dobroEIncrementar = (n) => incrementar(dobro(n));
console.log(dobroEIncrementar(5)); // 11
Uma função compor genérica que aplica da direita para a esquerda:
const compor = (f, g) => (x) => f(g(x));
const resultado = compor(incrementar, dobro);
console.log(resultado(5)); // 11
Currying
O currying transforma uma função de vários argumentos em uma sequência de funções de um único argumento. Permite "fixar" parâmetros e criar funções especializadas:
const multiplicar = (a) => (b) => a * b;
const porTres = multiplicar(3); // fixa a = 3
console.log(porTres(5)); // 15
console.log(multiplicar(2)(4)); // 8
Isso se apoia nos closures: a função interna "lembra" o valor de
a mesmo depois de a externa ter terminado. O currying e a composição são a
base para construir pipelines de transformação reutilizáveis.
Exemplos
Currying para criar funções especializadas
const somar = (a) => (b) => a + b;
const somar10 = somar(10);
console.log(somar10(5)); // 15
console.log(somar(2)(3)); // 5