Dans l'algèbre universelle un algèbre consiste en ensembles d'éléments (pensez à chaque ensemble comme l'ensemble de valeurs d'un type) et des opérations, qui mappent des éléments vers d'autres éléments.
Par exemple, supposez que vous avez un type d'"éléments de liste" et un type de "listes". Comme opérations vous avez la "liste vide", qui est une fonction à 0 arguments retournant une "liste", et une fonction "cons" qui prend deux arguments, un "élément de liste" et une "liste", et produit une "liste".
À ce stade, il y a de nombreuses algèbres qui correspondent à cette définition, car deux choses indésirables peuvent se produire:
-
Il pourrait y avoir des éléments dans l'ensemble "liste" qui ne peuvent pas être construits à partir de la "liste vide" et de l'opération "cons", une sorte de "junk". Il pourrait s'agir de listes commençant par un élément tombé du ciel, de boucles sans commencement, ou de listes infinies.
-
Les résultats de "cons" appliqué à différents arguments pourraient être égaux, par exemple, ajouter un élément à une liste non vide pourrait être égal à la liste vide. Cela s'appelle parfois "confusion".
Une algèbre qui ne présente aucune de ces propriétés indésirables est appelée algèbre initiale, et c'est le sens voulu du type de données abstrait.
Le nom initial provient de la propriété qu'il y a exactement un homomorphisme de l'algèbre initiale vers une algèbre donnée. Essentiellement vous pouvez évaluer la valeur d'une liste en appliquant les opérations dans l'autre algèbre, et le résultat est bien défini.
Cela devient plus compliqué pour les types polymorphes ...