next up previous contents index
Next: Structures de données polymorphes Up: Quelques éléments de Caml Previous: Types abstraits

Égalité de types

 La concordance des types se fait par nom. Les définitions de type sont qualifiées de génératives, c'est-à-dire qu'elles introduisent toujours de nouveaux types (à la manière des let emboîtés qui introduisent toujours de nouveaux identificateurs). Ainsi, deux types sont égaux s'ils font référence à la même définition de type.

Attention: ce phénomène implique que deux types de même nom coexistent parfois dans un programme. Dans le système interactif, cela arrive quand on redéfinit un type qui était erroné. Le compilateur ne confond pas les deux types, mais il énonce éventuellement des erreurs de type bizarres, car il n'a pas de moyen de nommer différemment les deux types. Étrangement, il indique alors qu'un type t (l'ancien) n'est pas compatible avec un type t (mais c'est le nouveau). Considérons les définitions

#type t = C of int;;
Le type t est défini.
#let int_of_t x =
  match x with C i -> i;;
int_of_t : t -> int = <fun>

Jusque là rien d'anormal. Mais définissons t à nouveau (pour lui ajouter un nouveau constructeur par exemple): l'argument de la fonction int_of_t est de l'ancien type t et on ne peut pas l'appliquer à une valeur du nouveau type t. (Voir aussi l'URL http://pauillac.inria.fr/caml/FAQ/FAQ_EXPERT-fra.html.)

#type t = C of int | D of float;;
Le type t est défini.
#int_of_t (C 2);;
Entrée interactive:
>int_of_t (C 2);;
>          ^^^
Cette expression est de type t,
mais est utilisée avec le type t.

Ce phénomène se produit aussi avec le compilateur indépendant (en cas de gestion erronée des dépendances de modules). Si l'on rencontre cet étrange message d'erreur, il faut tout recommencer; soit quitter le système interactif et reprendre une nouvelle session; soit recompiler entièrement tous les modules de son programme.


next up previous contents index
Next: Structures de données polymorphes Up: Quelques éléments de Caml Previous: Types abstraits

1/11/1998