En informatique, plus précisément en programmation fonctionnelle, la curryfication est la transformation d'une fonction à plusieurs arguments en une fonction à un argument qui retourne une fonction sur le reste des arguments. L'opération inverse est possible et s'appelle la décurryfication. Le terme vient du nom du mathématicien américain Haskell Curry, bien que cette opération ait été introduite pour la première fois par Moses Schönfinkel. Considérons une fonction add qui prend deux arguments (x et y) et en renvoie la somme. En la curryfiant, on obtient une fonction addcur qui prend un argument et renvoie une fonction qui prend le deuxième argument. En pseudo-langage : curry (add (x,y)) → addcur 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 bien : curried_add x = \y -> x + y où la barre oblique \ introduit une λ-expression (lambda-expression) et sert à définir des fonctions anonymes. Et voici une application partielle : main = do print (uncurried_add (3, 5)) -- 8 print ((curried_add 3) 5) -- 8 print (curried_add 3 5) -- 8 let add_three = curried_add 3 print (add_three 5) -- 8 print (add_three 12) -- 15 Remarques La curryfication peut se faire à la main ou bien par un programme. Pour les fonctions à deux arguments, voici ces programmes en Haskell : main = do let uncurried = uncurry curried_add print (uncurried (3, 5)) -- 8 let curried = curry uncurried_add print ((curried 3) 5) -- 8 print (curried 3 5) -- 8 let add_three = curried 3 print (add_three 5) -- 8 print (add_three 12) -- 15 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, 5)) # 8 print(curried_add(3)(5)) # 8 add_three = curried_add(3) print(add_three(5)) # 8 print(add_three(12)) # 15 Même fonction en Caml : let uncurried_add(x, y) = x + y;; (* Type de la fonction : (entier * entier) -> entier ) let curried_add x y = x + y;; ( Type de la fonction : entier -> entier -> entier ) uncurried_add(3,4);; ( Retourne 7.
Jian Wang, Olivier Schneider, Yiming Li, Yi Zhang, Aurelio Bay, Guido Haefeli, Christoph Frei, Frédéric Blanc, Tatsuya Nakada, Michel De Cian, Luca Pescatore, François Fleuret, Elena Graverini, Chitsanu Khurewathanakul, Renato Quagliani, Maria Vieites Diaz, Federico Betti, Aravindhan Venkateswaran, Luis Miguel Garcia Martin, Vitalii Lisovskyi, Mingkui Wang, Zhirui Xu, Lei Zhang, Jessica Prisciandaro, Mark Tobin, Minh Tâm Tran, Niko Neufeld, Matthew Needham, Marc-Olivier Bettler, Greig Alan Cowan, Maurizio Martinelli, Vladislav Balagura, Donal Patrick Hill, Cédric Potterat, Liang Sun, Pietro Marino, Mirco Dorigo, Jean Wicht, Xiaoxue Han, Sebastiana Gianì, Liupan An, Federico Leo Redi, Plamen Hristov Hopchev, Thibaud Humair, Maxime Schubiger, Hang Yin, Guido Andreassi, Violaine Bellée, Olivier Göran Girard, Axel Kuonen, Preema Rennee Pais, Pavol Stefko, Maria Elena Stramaglia, Tommaso Colombo, Vladimir Macko, Guillaume Max Pietrzyk, Lino Ferreira Lopes, Dipanwita Dutta, Yi Wang, Hans Dijkstra, Gerhard Raven, Peter Clarke, Frédéric Teubert, Giovanni Carboni, Victor Coco, Adam Davis, Paolo Durante, Yu Zheng, Anton Petrov, Maxim Borisyak, Feng Jiang, Zhipeng Tang, Luis Alberto Granado Cardoso, Daniel Hugo Cámpora Pérez