Nous utilisons depuis le début du cours les modules. Un module est simplement un subdivision d'un programme, contenant donc définitions de types et de valeurs, ainsi que d'autres modules. L'histoire ne s'arrête cependant pas là, il est possible d'utiliser les modules autrement que juste pour grouper des morceaux de programme, et c'est ce sur quoi ce cours va porter.
Nous avons déjà appris à définir un module, avec la syntaxe :
Nous avons aussi vu que les modules possèdent des types, et la syntaxe associée pour définir le type d'un module :
Une conséquence est qu'il est possible de définir un module et de spécifier son type. Ceci permet par exemple de définir avec précision quelles sont les types et valeurs définies par le module que l'on souhaite exporter : seules ceux définis dans le type du module sont alors visible. Le type de module permet donc de donner une interface par laquelle les valeurs dans le module peuvent être utilisées. On appelle donc aussi les types de modules des interfaces. Pour specifier le type d'un module au moment de le créer, on ajoute une annotation de type :
L'avantage de nommer une interface est de pouvoir l'utiliser sur plusieurs modules différents. Nous verrons plusieurs interfaces classiques que l'on peut retrouver dans de nombreux contextes. Un autre avantage est de pouvoir écrire des programmes dépendant d'une interface, sans dépendre explicitement d'une implémentation de cette interface. Par ailleurs, le nom d'une interface est, comme tout nom, une forme de documentation.