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.

Sommaire

[modifier] Définition

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.

[modifier] Exemples

[modifier] Haskell

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 

[modifier] Python

Même fonction 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)

[modifier] Caml

Même fonction 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;;

[modifier] Scheme

  (define uncurried-add (lambda (x y)
                                (+ x y)))
  (define curried_add (lambda (x) (lambda (y) (+ x y))))
  (define add-three (curried_add 3))

[modifier] Perl 6

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] Remarques

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


[modifier] Voir aussi

Ce document provient de « http://fr.wikipedia.org/wiki/Curryfication ».
Créer un livre