Ter uma função f que recebe argumentos x 1 , x 2 ,…, x n
- ie. f: X 1 × X 2 ×… × X n → Y
- currying redefine f como uma função usando um único argumento a 1 que mapeia para outra função. Essa técnica é útil para aplicação parcial, por exemplo, com uma pow
função ao curry que poderíamos escrever exp = pow(e)
.
Exemplo
Assumindo que temos a seguinte função f usando três argumentos ( f: X 1 × X 2 × X 3 → Y ):
def f(a,b,c):
return a + b * c
A seleção dessa função nos deixa com f_curry: X 1 → (X 2 → (X 3 → Y)) , se agora chamarmos essa função duas vezes, obteríamosf_curry(1)(2)
uma função ( h
) equivalente ao seguinte retornado:
def h(c):
return 1 + 2 * c
A função ao curry f
pode ser escrita assim (Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
Desafio
Seu desafio será curry uma função como descrito acima, aqui estão as regras:
- Entrada será uma função de caixa preta que requer pelo menos 2 argumentos
- A função de entrada sempre terá um número fixo de argumentos (diferente
printf
ou semelhante, nota: você precisa suportar funções com qualquer número de argumentos ≥2) - Se o seu idioma usa funções com caril por padrão (por exemplo, Haskell), você pode esperar que a função de entrada seja definida sobre N- pares, em vez de uma "função de ordem superior"
- Você pode usar o número de argumentos como entrada
- A saída será o equivalente ao curry da entrada *
- Você pode assumir que a função de saída será sempre:
- chamado com menor ou igual ao número de argumentos que a função de entrada leva
- chamado com argumentos do tipo certo
* Isso significaria para uma entrada f
com N
argumentos e uma saída h
que, para todos os argumentos válidos, a1,…,aN
ela contenha isso f(a1,a2,…,aN) == h(a1)(a2)…(aN)
.
def f(a,b,c): return a + b * c
e a saída é def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(que é definida em algum lugar) e a saída deve ser algo equivalente f_curry
. Ou a entrada seria lambda a,b,c: a+b*c
e a saída uma função equivalente a f_curry
.