Meu entendimento limitado é esse:
1) Aplicação da função parcial
Aplicação de Função Parcial é o processo de retornar uma função que recebe um número menor de argumentos. Se você fornecer 2 de 3 argumentos, ele retornará uma função que leva 3-2 = 1 argumento. Se você fornecer 1 de 3 argumentos, ele retornará uma função que aceita 3-1 = 2 argumentos. Se você quisesse, você poderia aplicar parcialmente 3 de 3 argumentos e retornaria uma função que não aceita argumentos.
Então, a seguinte função:
f(x,y,z) = x + y + z;
Ao vincular 1 a x e aplicar parcialmente à função acima f(x,y,z)
você obteria:
f(1,y,z) = f'(y,z);
Onde: f'(y,z) = 1 + y + z;
Agora, se você vincular y a 2 e z a 3, e aplicar parcialmente f'(y,z)
, você terá:
f'(2,3) = f''();
Onde: f''() = 1 + 2 + 3
;
A qualquer momento, você pode optar por avaliar f
, f'
ou f''
. Então eu posso fazer:
print(f''()) // and it would return 6;
ou
print(f'(1,1)) // and it would return 3;
2) Curry
Currying , por outro lado, é o processo de dividir uma função em uma cadeia aninhada de funções de um argumento. Você nunca pode fornecer mais de 1 argumento, é um ou zero.
Então, a mesma função:
f(x,y,z) = x + y + z;
Se você curry, você teria uma cadeia de 3 funções:
f'(x) -> f''(y) -> f'''(z)
Onde:
f'(x) = x + f''(y);
f''(y) = y + f'''(z);
f'''(z) = z;
Agora, se você chamar f'(x)
com x = 1
:
f'(1) = 1 + f''(y);
Você recebe uma nova função:
g(y) = 1 + f''(y);
Se você chamar g(y)
com y = 2
:
g(2) = 1 + 2 + f'''(z);
Você recebe uma nova função:
h(z) = 1 + 2 + f'''(z);
Finalmente, se você chamar h(z)
com z = 3
:
h(3) = 1 + 2 + 3;
Você está retornando 6
.
3) Encerramento
Finalmente, Closure é o processo de capturar uma função e dados juntos como uma única unidade. Um fechamento de função pode levar 0 a um número infinito de argumentos, mas também está ciente dos dados não passados para ele.
Novamente, dada a mesma função:
f(x,y,z) = x + y + z;
Você pode escrever um fechamento:
f(x) = x + f'(y, z);
Onde:
f'(y,z) = x + y + z;
f'
está fechado em x
. O que significa que f'
pode ler o valor de x dentro de f
.
Se você fosse chamar f
com x = 1
:
f(1) = 1 + f'(y, z);
Você teria um fechamento:
closureOfF(y, z) =
var x = 1;
f'(y, z);
Agora, se você chamou closureOfF
com y = 2
e z = 3
:
closureOfF(2, 3) =
var x = 1;
x + 2 + 3;
Qual seria o retorno de 6
Conclusão
O currying, a aplicação parcial e os encerramentos são todos semelhantes, na medida em que eles decompõem uma função em mais partes.
Currying decompõe uma função de vários argumentos em funções aninhadas de argumentos únicos que retornam funções de argumentos únicos. Não adianta restringir uma função de um ou menos argumentos, pois não faz sentido.
O aplicativo parcial decompõe uma função de vários argumentos em uma função de argumentos menores, cujos argumentos ausentes agora foram substituídos pelo valor fornecido.
O Closure decompõe uma função em uma função e um conjunto de dados em que as variáveis dentro da função que não foram passadas podem procurar dentro do conjunto de dados para encontrar um valor para vincular quando solicitado a avaliar.
O que é confuso sobre tudo isso é que eles podem ser usados para implementar um subconjunto dos outros. Então, na essência, eles são todos detalhes de implementação. Todos eles fornecem um valor semelhante, pois você não precisa reunir todos os valores antecipadamente e pode reutilizar parte da função, já que a decompôs em unidades discretas.
Divulgação
Eu não sou de modo algum um especialista no assunto, só recentemente comecei a aprender sobre isso, e então eu forneço meu entendimento atual, mas ele pode ter erros que eu convido você a apontar, e eu vou corrigir como / se eu descobrir algum.