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