Curryfication
Un article de Wikipédia, l'encyclopédie libre.
La curryfication désigne l'opération qui fait passer d'une fonction à plusieurs arguments à une fonction à un argument et qui retourne une fonction qui prend le reste des arguments. L'opération inverse est évidemment possible.
Imaginons une fonction add(x,y) qui prend deux arguments et en renvoie la somme. Une fois curryfiée, on aurait un fonction add(x) qui prend un argument et renvoie une fonction qui prend le deuxième argument. En pseudo-langage :
curry (add (x,y)) -> add x -> lambda (y -> x + y)
La curryfication permet l'application partielle : si on appelle la fonction curryfiée avec l'argument 3, on récupère une fonction qui ajoute 3 à son argument.
En Haskell voici une fonction non-curryfiée :
uncurried_add x y = x + y
et la même après curryfication (la barre \ signifie lambda et sert pour définir des fonctions anonymes) :
curried_add x = \y -> x + y
Et voici une application partielle :
add_three = curried_add 3
Et la même chose en Python :
def uncurried_add (x, y): return x + y def curried_add (x): return lambda y: x + y print uncurried_add(3, 4) add_three = curried_add(3) print add_three(4)
La curryfication peut se faire à la main ou bien par un programme. Pour les fonctions à deux arguments, voici ces programmes en Haskell :
curry f x y = f(x,y) uncurry f (x, y) = f x y
Un JAPH qui est un exemple de curryfication en Perl 6 :
sub japh (Str $lang) { say "just another $lang hacker"; } my &perl6Japh := &japh.assuming("Perl6"); perl6Japh();