Meu entendimento limitado é o seguinte:
1) Aplicação de Função Parcial
Aplicação de Função Parcial é o processo de retornar uma função que requer um número menor de argumentos. Se você fornecer 2 de 3 argumentos, retornará uma função que aceita 3-2 = 1 argumento. Se você fornecer 1 dentre 3 argumentos, retornará uma função que aceita 3-1 = 2 argumentos. Se você quisesse, poderia aplicar parcialmente 3 em 3 argumentos e retornaria uma função que não aceita argumentos.
Dada a seguinte função:
f(x,y,z) = x + y + z;
Ao vincular 1 a x e aplicá-lo parcialmente à função acima, f(x,y,z)
você obtém:
f(1,y,z) = f'(y,z);
Onde: f'(y,z) = 1 + y + z;
Agora, se você ligasse y a 2 e z a 3, e se aplicasse parcialmente, f'(y,z)
obteria:
f'(2,3) = f''();
Onde f''() = 1 + 2 + 3
:;
Agora, a qualquer momento, você pode escolher para 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) Caril
Curry, 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 um argumento, é um ou zero.
Então, dada a mesma função:
f(x,y,z) = x + y + z;
Se você o curry, você terá 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ê ligar f'(x)
com x = 1
:
f'(1) = 1 + f''(y);
Você retorna uma nova função:
g(y) = 1 + f''(y);
Se você ligar g(y)
com y = 2
:
g(2) = 1 + 2 + f'''(z);
Você retorna uma nova função:
h(z) = 1 + 2 + f'''(z);
Finalmente, se você ligar h(z)
com z = 3
:
h(3) = 1 + 2 + 3;
Você voltou 6
.
3) Fechamento
Finalmente, o encerramento é o processo de capturar uma função e dados juntos como uma única unidade. Um fechamento de função pode levar de 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 x
. Significado que f'
pode ler o valor de x que está dentro f
.
Portanto, se você ligar f
para x = 1
:
f(1) = 1 + f'(y, z);
Você obteria um fechamento:
closureOfF(y, z) =
var x = 1;
f'(y, z);
Agora, se você ligou closureOfF
com y = 2
e z = 3
:
closureOfF(2, 3) =
var x = 1;
x + 2 + 3;
O que retornaria 6
Conclusão
Caril, aplicação parcial e fechamentos são todos semelhantes, pois decompõem uma função em mais partes.
O curry 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 faz sentido curry uma função de um ou menos argumentos, uma vez que 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 agora ausentes foram substituídos pelo valor fornecido.
Closure decompõe uma função em uma função e um conjunto de dados em que variáveis dentro da função que não foram passadas podem olhar dentro do conjunto de dados para encontrar um valor ao qual vincular quando solicitado a avaliar.
O que é confuso sobre tudo isso é que eles podem ser usados para implementar um subconjunto dos outros. Então, em essência, eles são todos um detalhe 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, pois a decompôs em unidades discretas.
Divulgação
Não sou especialista no assunto, só recentemente comecei a aprender sobre isso e, portanto, forneço meu entendimento atual, mas pode haver erros que eu convido você a destacar e corrigirei como / se Eu descubro qualquer.