Currying ou Partial Application
[ não é a mesma coisa? ]

O que é Currying?
É basicamente o processo de transformar uma função com vários argumentos na mesma função com menos argumentos. Ou seja, você pode passar todos os argumentos que uma função está esperando e obter o resultado, ou passar um subconjunto desses argumentos e recuperar uma função que aguarda o resto dos argumentos. Simples!

Podemos transformar a função e aplicar o currying da seguinte forma:


Não entendeu? Não se preocupe! Provavelmente você não deve estar familiarizado com conceitos os de clousures, call & apply e higher-order functions. Nesse caso, eu indico ler um pouco mais sobre o assunto antes de continuar.
Entendeu agora? Ótimo! Vamos continuar…
É importante? Por que?
Você deve estar se perguntando agora como essa técnica pode ser útil. Bom, nada melhor que exemplos do ‘mundo real’ para provar a sua importância.
Event Handling

Renderização de HTML

Higher Order Function

Tudo bem, mas Aplicação Parcial. O que é?
Significa assumir uma função e aplicá-la inicialmente a um ou mais dos seus argumentos, mas não a todos, criando uma nova função no processo. E isso já foi falando durante currying, né?
Em outras palavras, uma função que leva uma função com múltiplos parâmetros e retorna uma função com menos parâmetros.

Se você está no mesmo barco, não se preocupe. Vamos lá!
De forma sucinta:
- currying: você pode passar todos os argumentos que uma função está esperando para obter o resultado.
- partial application: quando, no processo de currying, você usa algumas, mas não todas as resultantes. Ou seja, como o próprio nome diz, parcialmente.
Não entendeu? Tudo bem, vamos continuar…
Vamos assumir que temos uma função add que leva 2 números como entrada e retorna um número como saída.
add( 7, 5 ) // 12. Nesse caso:
Currying

Partial Application

Em outras palavras, currying e partial application são diferentes.
Currying leva exatamente 1 entrada, enquanto a partial application leva 2 (ou mais) entradas.
Mesmo que ambos retornem uma função como saída, as funções retornadas são de formas totalmente diferentes como demonstrado acima.
