Il existe un autre moyen, pour éviter les alias entre types structurellement identiques, qui consiste à passer par le système de modules et les type abstraits. Ta solution, bien que résolvant ta problématique, rajoute une indirection en mémoire : tes types sont des pointeurs sur des couples de int (qui n'ont pas la même étiquette et ne sont donc pas identiques). Afin d'éviter ce pointeur, on peut utiliser des modules dans lesquels les types seront directement des couples mais en le cachant au monde extérieur.
Exemple :
(* on définit une signature pour un module de coordonnés *)moduletypeCoord=sigtypetvalmake:int->int->tvalto_pair:t->int*intend(* on définit deux implémentations identiques *)moduleA:Coord=structtypet=int*intletmakeij=(i,j)letto_pairx=xend;;moduleA:CoordmoduleB:Coord=structtypet=int*intletmakeij=(i,j)letto_pairx=xend;;moduleB:Coord
Ici, comme l'interface des modules définit un type t sans rien dire sur lui (on parle de type abstrait), les types A.t et B.t sont incompatibles, bien que structurellement identiques.
letp=A.make12;;valp:A.t=<abstr>A.to_pairp;;-:int*int=(1,2)(* les types ne sont pas compatibles *)B.to_pairp;;Error:ThisexpressionhastypeA.tbutanexpressionwasexpectedoftypeB.t
Ensuite, il est aisé, à partir des primitives des modules, d'écrire des fonctions de conversions d'un type dans l'autre :
# Module et type abstrait
Posté par kantien . En réponse au journal Une petite histoire d'utilisation type fort dans Ocaml. Évalué à 5.
Il existe un autre moyen, pour éviter les alias entre types structurellement identiques, qui consiste à passer par le système de modules et les type abstraits. Ta solution, bien que résolvant ta problématique, rajoute une indirection en mémoire : tes types sont des pointeurs sur des couples de
int(qui n'ont pas la même étiquette et ne sont donc pas identiques). Afin d'éviter ce pointeur, on peut utiliser des modules dans lesquels les types seront directement des couples mais en le cachant au monde extérieur.Exemple :
Ici, comme l'interface des modules définit un type t sans rien dire sur lui (on parle de type abstrait), les types
A.tetB.tsont incompatibles, bien que structurellement identiques.Ensuite, il est aisé, à partir des primitives des modules, d'écrire des fonctions de conversions d'un type dans l'autre :
P.S : tout système de types, quelque soit le langage, a à voir avec la preuve de programme, mais là c'est une autre histoire. ;-)
Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.