Monade (informatique)
Un article de Wikipédia, l'encyclopédie libre.
On se place dans le cadre de la programation fonctionnelle typée.
Un type monadique M(t) dérivé d'un type t est la donnée de
-
- une fonction
qui construit une monade de type M(t) à partir de n'importe quel objet de type t ; - une fonction
qui permet d'appliquer une fonction
à une monade de type M(t).
- une fonction
En composant la fonction >>= (dite fonction de liaison) avec la fonction return, on peut appliquer n'importe quelle fonction
à une monade de type M(t). En ce sens une monade de type M(t) est un objet qui dérive du type t.
L'utilisation la plus simple des monades consiste à encapsuler un objet de type existant dans un objet portant plus d'information. Par exemple en langage Haskell, une monade de type Maybe(t) est ou bien un objet de type t normal, ou bien la valeur Nothing. Cela permet de traiter de façon élégante les opérations interdites comme les divisions par zéro : int / int vaut ainsi un Maybe(int).
Une autre utilisation fondamentale des monades est la gestion des entrées/sorties dans un programme Purement fonctionnel, c'est-à-dire sans effets de bord. C'est le cas de la monade IO(t) en Haskell, qui représente un programme impératif sans paramètre et renvoyant une valeur de type t. Ainsi getLine est une monade de type IO(String), un programme impératif qui lorsqu'il est exécuté renvoie une chaîne de caractères (celle tapée au clavier). Confirmons qu'un programme impératif renvoyant un t est une monade. A tout objet o de type t on peut associer le programme trivial
qui renvoie toujours o. C'est d'ailleurs l'origine de la notation return pour les types monadiques. Ensuite étant donné une fonction g:t->t il est naturel de pouvoir l'appliquer à un programme qui renvoie un t, cela donne un autre programme qui renvoie un t. On peut voir cette opération comme la concaténation du code source du premier programme et du code de la fonction g.
La programmation fonctionnelle contourne ainsi le problème des entrées/sorties (naturellement des effets de bords) par la manipulation de ces programmes impératifs eux-mêmes et non des valeurs qu'ils retournent. Pour se fixer les idées, on peut se dire qu'une monade de type IO(int) est le code C d'un programme renvoyant un entier. Ainsi le type IO(int) est complètement légitime dans le cadre fonctionnel puisque que c'est simplement du texte. Lors de la compilation du programme fonctionnel, ces monades seront traduites en du code binaire qui aura bien l'effet attendu lorsqu'il sera exécuté par la machine. En particulier le main en Haskell est toujours de type IO(void).
[modifier] Voir aussi
[modifier] Liens externes
- (en) A (hopefully) painless introduction to monads
- (en) What the hell are Monads?
- (en) You Could Have Invented Monads! (And Maybe You Already Have.)
- (en) All About Monads
- (en) Monads as Computation
- (en) Monads as Containers
- (en) Monads for the Working Haskell Programmer
- (en) "Monads for Functional Programming" par Philip Wadler
- (en) A tour of the Haskell Monad functions par Henk-Jan van Tuyl
- (en) The Haskell Programmer's Guide to the IO Monad — Don't Panic
- (en) Monads in Ruby
- (en) Monads in Python
- (en) Notions of Computation and Monads par Eugenio Moggi
- (en) Introduction to Haskell, Part 3: Monads

