Currying

"Currificar" uma função significa reorganizar sua escrita para que a passagem de parâmetros seja definida gradualmente.

// Versão padrão.
function op(a, b, c) {
    return a * (b - c)
}
console.log(op(4, 3, 1))

// Versão "curried".
function subcurried(a) {
    return function (b) {
        return function (c) {
            return a * (b - c)
        }
    }
}
console.log(subcurried(4)(3)(1))
8
8

Uma das vantagens de se utilizar versões /curried/ de funções é fomentar o reuso através da viabilização da aplicação parcial.

// Versão "curried" com notação arrow.
const subcurried = (a) => (b) => (c) => a * (b - c)
console.log(subcurried(4)(3)(1))

// Reuso através da aplicação parcial da função.

const somar = (x) => (y) => subcurried(-1)(-x)(y)
console.log(somar(1)(1))

const subtrair = subcurried(1)
console.log(subtrair(5)(8))

const dobro = subcurried(-2)(0)
console.log(dobro(10))

const negativo = subcurried(1)(0)
console.log(negativo(11))
8
2
-3
20
-11