Curryfication

Un article de Wikipédia, l'encyclopédie libre.

En programmation fonctionnelle, 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. La curryfication permet de créer des fonctions pures.

Le terme vient du nom du mathématicien américain Haskell Curry.

Imaginons une fonction add(x, y) qui prend deux arguments et en renvoie la somme. Une fois curryfiée, on aurait une 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:

  curried_add x y = x + y


ou (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)

Enfin en Caml :

let uncurried_add(x,y) = x + y;;
  let curried_add x y = x + y;;
  uncurried_add(3,4);;
  let add_three = curried_add 3;;
  add_three 4;;

La fonction add_three est dite pure.

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();

[modifier] Voir aussi