En informatique, une monade est un patron de conception qui consite à envelopper des valeurs dans un conteneur particulier, auquel il est facile d'appliquer des séries d'opérations. Elle peut par exemple permettre une gestion simplifiée des erreurs d'exécutions, ou d'appliquer un calcul à une collection d'objets. Elle sont principalement utilisées dans le contexte de la programmation fonctionnelle.

Plus concrètement, une monade est un constructeur de type, qui à n'importe quel type peut associer le type . Celui-ci doit être équipé de deux opérations : une qui construit à partir d'un élément de type (faisant passer l'élément dans le contexte monadique), et une autre permettant d'appliquer une fonction prenant en entrée le type à un élément (permettant d'appliquer la fonction en conservant le contexte monadique). Ces deux opérations doivent répondre à certaines contraintes de comportement entre elles pour pouvoir qualifier l'objet de monade. De nombreuses constructions communément utilisées, comme List, Option, Result, ... sont des monades.

L'usage des monades présente plusieurs intérêts : analyses statiques et preuves de programmes plus simples, usage de l'appel par nécessité, optimisations (déforestation, mémoïsation de valeurs, parallélisation, ).

Concepts Définition formelle Une monade peut se voir comme la donnée d'un triplet constitué des trois éléments suivants : un constructeur de type appelé type monadique, qui associe au type le type ; une fonction nommée unit ou return, qui construit à partir d'un élément de type sous-jacent un autre objet de type monadique . Cette fonction est alors de signature ; une fonction bind, représentée par l'opérateur infixe , associant à un type monadique et une fonction d'association un autre type monadique. Il permet de composer une fonction monadique à partir d'autres fonctions monadiques. Cet opérateur est de type .

En composant la fonction (dite fonction de liaison) avec la fonction , on peut appliquer n'importe quelle fonction à une monade de type . En ce sens une monade de type est un type algébrique qui dérive du type .

Axiomes La définition précédente s'accompagne de plusieurs axiomes . L'opérateur agit comme une sorte d'élément neutre pour . composition à gauche par (≡ désigne l'égalité structurelle) :

composition à droite par :

associativité : (ou )

Utilisation 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 est ou bien un objet de type t normal, ou bien la valeur . Cela permet de traiter de façon élégante les opérations interdites.

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 en Haskell, qui représente un programme impératif sans paramètre et renvoyant une valeur de type t. Ainsi getLine est une action de type , 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 est une monade. À tout objet de type on peut associer le programme trivial qui renvoie toujours . C'est d'ailleurs l'origine de la notation 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 c'est simplement du texte. Lors de la compilation du programme fonctionnel, ces monades seront traduites en code machine qui aura l'effet attendu lorsqu'il sera exécuté.

Voir aussi Flèches dans la programmation fonctionnelle Idiome de programmation

Notes et références

Liens externes Monads as Computation Monads as Containers Monads for the Working Haskell Programmer "Monads for Functional Programming" par Philip Wadler

Catégorie:Informatique théorique Catégorie:Programmation fonctionnelle