En poursuivant votre navigation sur ce site, vous acceptez l’utilisation de cookies pour réaliser des statistiques de visites. X

Contact

N'hésitez pas si vous avez une questions, une idée ou tout à autres choses à nous dire ! Vous pouvez également directement nous envoyer un mail à contact@lilleweb.fr.

Currying

There is a way to reduce functions of more than one argument to functions of one argument, a way called currying - Haskell B. Curry*

L’idée est de réduire à un le nombre de paramètre d’une méthode en nécessitant normalement plus et ainsi favoriser la composition.

Exemple

On va essayer de créer une fonction très simple d’addition :

add = (n, m) => (n + m)

add(39,3) vaudrait 42.

Maintenant que notre fonction d’addition fonctionne bien, on va créer une méthode d’addition qui prend un seul paramètre et qui renvoie une fonction de degré un.

curryedAdd = (n) => ( (m) => add(n, m) )

Notre fonction intermédiaire nous permet maintenant de créer une méthode permettant d’ajouter 7 à un nombre :

addSeven = curryedAdd(7)

addSeven renvoie une méthode qui demande un paramètre et renvoie une copie augmentée de sept.

addSeven(35) // 42

En résumé :

add = (n, m) => (n + m)

curryedAdd = (n) => ( (m) => add(n, m) )

addSeven = curryedAdd(7)
addSeven(35) // 42

Partial

Dans le même principe, une application partielle (partial application) signifique que vous allez appliquer un pré-traitement à votre méthode :

add = (n, m) => (n + m)
addSeven = (m) => add(7, m);
addSeven(35) // 42

Intérêts

Test

Une méthode à un seul paramètre qui possède une partie de sa logique déportée dans une autre méthode est beaucoup plus facile à tester.

Simplifier les méthodes à callback

La méthode addOne, ne prenant qu’un seul paramètre, peut être utilisée très facilement comme callback pour des méthodes comme map, filter, reduce, etc.

add = (n, m) => n + m
curryedAdd = (n) => ( (m) => add(n, m) )
addOne = curryedAdd(1)

values = [1, 2, 3, 4, 5, 6, 7, 8, 9];

addedValues = values.map(add); //​​​​​[ 1, 3, 5, 7, 9, 11, 13, 15, 17 ]​​​​​
addedOneValues = values.map(addOne); //​​​​​[ 2, 3, 4, 5, 6, 7, 8, 9, 10 ]​​​​​

Les Higher Order Function (HOF)

Nous verrons dans un prochain article ce qu’est une HOF et comment en construire.

*(The Kleene Symposium, page 86. North Holland Publishing Company, Amsterdam, 1980.)

Johnathan MEUNIER Johnathan MEUNIER Profil Github de Johnathan MEUNIER

Ingénieur logiciel Full Stack JS chez AXA, Johnathan est passionné de web depuis plusieurs années. Spécialisé en JavaScript, il est ouvert à toutes les technos tant qu'elles apportent un plus à la communauté.
Il vous donnera aussi son avis sur l'actu High-Tech.

comments powered by Disqus

Partager