- Curryfication
-
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, bien que cette opération fut introduite pour la première fois par Moses Schönfinkel.
Sommaire
Définition
Imaginons une fonction
add(x, y)
qui prend deux arguments et en renvoie la somme. Une fois curryfiée, on aurait une fonctionadd(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.
Exemples
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
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)
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;;
Scheme
(define uncurried-add (lambda (x y) (+ x y))) (define curried_add (lambda (x) (lambda (y) (+ x y)))) (define add-three (curried_add 3))
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();
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
Voir aussi
Wikimedia Foundation. 2010.