1.3 Syntaxe des types de mini-ML
L'ensemble des types ( T) de mini-ML est construit à partir d'un ensemble de
constantes de types ( C), un ensemble de variables de types ( P) et de 3 constructeurs
de types (®, * et list).
-
constante de type :
Int_type
, Float_type
, String_type
, Bool_type
et Unit_type
Î C : si aÎ C alors aÎ T;
- variable de type Î P :si aÎ P alors aÎ T;.
- type produit : si s, t Î T alors s * t Î T;
- type liste : si s Î T alors s list Î T;
- type fonctionnel : si s, t Î T alors s ® t Î T;
La syntaxe abstraite des types de mini-ML est la suivante :
# type
vartype
=
|
Unknown
of
int
|
Instanciated
of
ml_type
and
consttype
=
|
Int_type
|
Float_type
|
String_type
|
Bool_type
|
Unit_type
and
ml_type
=
|
Var_type
of
vartype
ref
|
Const_type
of
consttype
|
Pair_type
of
ml_type
*
ml_type
|
List_type
of
ml_type
|
Fun_type
of
ml_type
*
ml_type;;
Où une variable de type est une référence sur une inconnue ou un type. Cela permettra
d'effectuer une modification de types lors de l'application d'une substitution sur une variable de type.
La fonction de création de variables de type est la suivante :
# let
new_unknown,
reset_unknowns
=
let
c
=
ref
1
in
(
(function
()
->
c:=
!
c+
1
;
Var_type(
ref(Unknown
!
c))),
(function
()
->
c:=
1
))
;;
val new_unknown : unit -> ml_type = <fun>
val reset_unknowns : unit -> unit = <fun>
L'ensemble des types qui vient d'être décrit correspondant aux types simples étendus
par les constantes de type et les constructeurs pour les paires et les listes.
Il est encore nécessaire de définir les schémas de type (type quantified_type
).
# type
quantified_type
=
Forall
of
(int
list)
*
ml_type;;
type quantified_type = | Forall of int list * ml_type