Avoir une fonction f qui prend les arguments x 1 , x 2 ,…, x n
- c'est à dire. f: X 1 × X 2 ×… × X n → Y
- le curry redéfinit f comme une fonction prenant un seul argument a 1 qui correspond à une autre fonction. Cette technique est utile pour une application partielle, par exemple avec une pow
fonction curry que nous pourrions écrire exp = pow(e)
.
Exemple
En supposant que nous ayons la fonction f suivante en prenant trois arguments ( f: X 1 × X 2 × X 3 → Y ):
def f(a,b,c):
return a + b * c
Le curry de cette fonction nous laisse avec f_curry: X 1 → (X 2 → (X 3 → Y)) , si nous appelions maintenant cette fonction deux fois avec f_curry(1)(2)
nous obtiendrions une fonction ( h
) équivalente à la suivante:
def h(c):
return 1 + 2 * c
La fonction curry f
pourrait être écrite comme ceci (Python 3):
def f_curry(a):
def g_curry(b):
def h(c):
return a + b * c
return h
return g_curry
Défi
Votre défi sera de curry une fonction comme décrit ci-dessus, voici les règles:
- L'entrée sera une fonction blackbox qui prend au moins 2 arguments
- La fonction d'entrée aura toujours un nombre fixe d'arguments (contrairement
printf
ou similaire, notez: vous devez prendre en charge les fonctions avec un nombre d'arguments ≥2) - Si votre langue utilise des fonctions curry par défaut (par exemple Haskell), vous pouvez vous attendre à ce que la fonction d'entrée soit définie sur N -tuples, au lieu d'une "fonction d'ordre supérieur"
- Vous pouvez prendre le nombre d'arguments en entrée
- La sortie sera l'équivalent au curry de l'entrée *
- Vous pouvez supposer que la fonction de sortie ne sera que:
- appelé avec moins ou égal au nombre d'arguments que la fonction d'entrée prend
- appelé avec des arguments du bon type
* Cela signifierait pour une entrée f
avec des N
arguments et une sortie h
que pour tous les arguments valides, a1,…,aN
elle contient cela f(a1,a2,…,aN) == h(a1)(a2)…(aN)
.
def f(a,b,c): return a + b * c
et la sortie est def f_curry(a): def g_curry(b): def h(c): return a + b * c return h return g_curry
?
f
(qui est définie quelque part) et la sortie devrait être quelque chose d'équivalent f_curry
. Ou l'entrée serait lambda a,b,c: a+b*c
et la sortie une fonction équivalente à f_curry
.