Un type algébrique est une forme de type de données composite, qui combine les fonctionnalités des types produits (‐uplets ou enregistrements) et des types sommes (union disjointe). Combinée à la récursivité, elle permet d’exprimer les données structurées telles que les listes et les arbres.

Définitions

Type produit

Le type produit de deux types et est l’analogue en théorie des types du produit cartésien ensembliste et est noté . C’est le type des couples dont la première composante est de type et la seconde de type . Deux fonctions canoniques lui sont associées, appelées projections, donnant la valeur de chaque composante.

Le produit se généralise naturellement à un nombre quelconque d’opérandes, pour donner des types de ‐uplets. Dans le cas particulier du produit vide, le type des 0‐uplets est nommé type unité et noté  : c’est l’élément neutre du produit et il contient une unique valeur, souvent notée .

Des considérations pratiques amènent souvent à nommer les composantes. Dans ce contexte, le type est souvent appelé structure et ses valeurs des enregistrements ; les composantes sont appelées membres, et la projection selon le membre m s’écrit avec une notation suffixe .m.

Type somme

Le type somme de deux types et est l’analogue en théorie des types de l’union disjointe ensembliste et est noté . Il représente un type contenant toutes les valeurs de chacun des deux types et , de telle sorte qu’une valeur issue de ne puisse pas être confondue avec une valeur issue de (même si ).

En théorie des ensembles, on représenterait la somme par l’ensemble  ; la première composante (1 ou 2) d’un tel objet est une étiquette qui indique si cet objet se trouve dans le bras de gauche () ou dans le bras de droite () de la somme. Les analogues en théorie des types des expressions et sont souvent notés et ( est la lettre grecque iota). Ces notations et peuvent être vues comme des fonctions injectives, respectivement de dans et de dans , qui permettent de construire les valeurs de la somme, d’où leur nom de constructeurs. Dans , la valeur est appelée l’argument du constructeur .

Traiter des valeurs d’un type somme requiert un raisonnement par cas, nommé dans ce contexte filtrage par motif. Chaque bras fait l’objet d’un cas séparé.

La somme se généralise naturellement à un nombre quelconque d’opérandes. Dans le cas particulier de la somme vide, le type est nommé type vide et noté : c’est l’élément neutre de la somme (et élément absorbant du produit) et il ne contient aucune valeur.

Type énuméré

Un type énuméré représente un ensemble fini, dont les éléments sont les différents constructeurs. Définir une fonction dessus revient à définir l’image de chaque élément, individuellement.

Type algébrique

Un type algébrique est une somme de produits, et généralise donc ces deux notions.

Ainsi, des cas spéciaux de types algébriques sont les types produits (un seul constructeur), les types sommes (un seul argument pour chaque constructeur) et les types énumérations (plusieurs constructeurs sans argument).

Polymorphisme

Dans les langages qui les supportent, les types algébriques peuvent être (paramétriquement) polymorphes, ce qui permet la programmation générique. Ainsi, la définition d’un type algébrique peut être paramétrée par des variables de types.

On peut alors définir des fonctions génériques agissant sur de tels types polymorphes.

Type algébrique généralisé

Récursivité

Listes

Un des exemples les plus importants de type algébrique est le type liste, défini de façon récursive par deux constructeurs : , aussi noté [], qui désigne la liste vide, et (abréviation de « constructeur »), aussi noté :: ou :, qui désigne la combinaison d’un élément et d’une liste plus courte. Par exemple, , aussi noté 1 :: 2 :: 3 :: 4 :: [], est la liste constituée des quatre éléments 1, 2, 3, 4, dans cet ordre.

Toutes les opérations sur les listes se définissent alors par récurrence, en utilisant le filtrage par motif. Par exemple, pour calculer la longueur d’une liste : la longueur de la liste vide () est zéro, et la longueur d’une liste de la forme est un plus la longueur de la liste .

Arbres

Les types algébriques permettent également de définir des structures d’arbres. Un arbre binaire peut se construire au moyen de deux constructeurs : qui désigne une feuille d’étiquette , et qui désigne un nœud interne d’étiquette , de fils gauche et de fils droit .

Par exemple, Node 1 (Node 2 (Leaf 4) (Node 5 (Leaf 6) (Leaf 7) ) ) (Leaf 3) est l’arbre suivant : 1 / \ 2 3 / \ 4 5 / \ 6 7

Comme pour les listes, les opérations sur les arbres se définissent par récurrence. Par exemple, pour calculer la hauteur d’un arbre : la hauteur d’une feuille est un, et la hauteur d’un nœud interne est un plus le maximum de la hauteur de ses deux fils.

Abstraction

Un type algébrique peut être abstrait : il suffit pour ça de ne pas exposer sa structure interne (ses constructeurs et leurs divers champs). Ainsi, il ne peut être manipulé que par les fonctions prévues à cet effet, et son implémentation peut être changée.

C’est une technique fréquente car les types algébriques permettent de réaliser des structures de données complexes.

Voir aussi

Type Type récursif Filtrage par motif Enregistrement Énumération

Liste Arbre

Notes et références

Notes

Références

dans , rédacteur en chef Denis Howe.

Catégorie:Programmation fonctionnelle Catégorie:Théorie des types