O que é Currying e como ele funciona?

Currying é uma técnica onde transformamos uma função que recebe múltiplos argumentos em uma sequência de funções, cada uma recebendo um único argumento. Vamos começar com um exemplo básico. Imagine que temos uma função que adiciona dois números:
function add(a, b) {
  return a + b;
}

console.log(add(3, 4)); // 7
Esta é uma função que recebe dois argumentos e retorna a soma deles. Agora, vamos ver como podemos curry esta função:
function curriedAdd(a) {
  return function(b) {
    return a + b;
  }
}

console.log(curriedAdd(3)(4)); // 7
Neste código convertido em curry, em vez de receber dois argumentos de uma vez, temos uma função que recebe o primeiro argumento e retorna outra função. Esta função retornada então pega o segundo argumento e realiza a adição. Chamamos assim: curriedAdd(3)(4), onde cada par de parênteses representa uma chamada de função. Mas por que quereríamos fazer isso? Currying nos permite criar algumas funções especiais facilmente. Por exemplo, poderíamos criar uma função que sempre adiciona cinco a qualquer número:
function curriedAdd(a) {
  return function(b) {
    return a + b;
  }
}

const addFive = curriedAdd(5);
console.log(addFive(10)); // 15
console.log(addFive(20)); // 25
Aqui, addFive é uma função que está sempre pronta para adicionar cinco a qualquer número que fornecermos. Este é um exemplo simples de aplicação parcial, onde fixamos um certo número de argumentos para uma função, produzindo outra função que recebe menos argumentos. Embora nossos exemplos tenham se concentrado em funções com dois argumentos, currying pode ser aplicado a funções com qualquer número de argumentos. À medida que você continua sua jornada em JavaScript, provavelmente encontrará muitas situações onde currying pode tornar seu código mais limpo e expressivo.
Este módulo não possui perguntas. Marque como concluído.