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 powfunçã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 fpode 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
printfou 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 fcom Nargumentos e uma saída hque, para todos os argumentos válidos, a1,…,aNela contenha isso f(a1,a2,…,aN) == h(a1)(a2)…(aN).
def f(a,b,c): return a + b * ce 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*ce a saída uma função equivalente a f_curry.