Types produits et types sommes en CaML Option Info - MPSI 2016 Types produits et types sommes en CaML Les types prédéfinis de CaML Types non paramétrés : 1 2 3 4 5 6 int float bool char string unit Types produits et types sommes en CaML Les types prédéfinis de CaML Types paramétrés : 1 2 3 4 5 ’a → ’b ’a ref ’a vect ’a list ’a * ’b Types produits et types sommes en CaML Créer de nouveaux types de données 1 2 Types produit Encapsulation d’informations (éventuellement hétérogènes) au sein d’une même valeur Exemple : un étudiant de CPGE ... nom (string), age (int), 3/2 (bool) Types somme Modélisation de données dont la structure est alternative Exemple : un nombre ... entier (int) ou bien décimal (float) Types produits et types sommes en CaML Le type produit “nombre complexe” type cplx = {re : float; im : float};; Le type cplx est défini. let z = {re = 1.3; im = 2.5};; z : cplx = {re = 1.3; im = 2.5} Accès en lecture aux champs d’un enregistrement : z.re;; - : float = 1.3 z.im;; - : float = 2.5 Types produits et types sommes en CaML Le type produit “nombre complexe” let module u = let x = u.re and y = u.im in sqrt (x *. x +. y *. y) ;; module : cplx -> float = <fun> module z;; - : float = 2.81780056072 Types produits et types sommes en CaML Le type produit “nombre complexe” let carre u = let x = u.re and y = u.im in {re = x *. x -. y *. y; im = 2. *. x *. y} ;; carre : cplx -> cplx = <fun> carre z;; - : cplx = {re = -4.56; im = 6.5} Types produits et types sommes en CaML Le type produit “élève” type élève = {prénom : string; age : int; demie_pension : bool};; Le type élève est défini. let e = {prénom = "Kevin"; age = 19; demie_pension = true};; e : élève = {prénom = "Kevin"; age = 19; demie_pension = true} Comment modifier la valeur d’un champ dans un enregistrement ? Types produits et types sommes en CaML Le type produit “élève” type élève = {prénom : string; mutable age : int; demie_pension : bool};; Le type élève est défini. A présent, le champ age est modifiable. On définit l’élève e comme précédemment, puis ... e.age ← 20;; - : unit = () e;; - : élève = {prénom = "Kevin"; age = 20; demie_pension = true} Types produits et types sommes en CaML Types produits : en résumé ... Définition d’un type produit : type nom_du_type = {champ_1 : type_1; ... } Définition d’une valeur de ce type : let enreg = {champ_1 = valeur_1; ...} Accès en lecture à un champ : enreg.champ_i Accès en écriture à un champ (déclaré mutable) : enreg.champ_i ← valeur Types produits et types sommes en CaML Point de vue ensembliste A quelle opération ensembliste la notion de “type produit” correspond-elle ? C’est le produit cartésien de deux ou plusieurs ensembles On examine maintenant la notion de “type somme”, qui correspond à l’opération d’union disjointe : type produit ↔ E = E1 × E2 × · · · × En type somme ↔ E = E1 t E2 t · · · t En Types produits et types sommes en CaML Le type somme “Carte à jouer” type couleur = Trefle | Carreau | Coeur | Pique ;; Le type couleur est défini. type carte = As of couleur | Roi of couleur | Dame of couleur | Valet of couleur | Petite_carte of int * couleur ;; Le type carte est défini. Types produits et types sommes en CaML Le type somme “Carte à jouer” Trefle, Carreau, Coeur, Pique sont les constructeurs du type couleur. Ce sont des constantes de ce type. Trefle;; - : couleur = Trefle;; couleur est un type énuméré. Exemple similaire déjà connu : le type bool. As et Petite_carte sont des constructeurs du type carte. Ce sont des fonctions à valeurs dans ce type. As;; - : couleur → carte = <fun> Petite_carte;; - : int * couleur → carte = <fun> Types produits et types sommes en CaML Valeur d’une carte let | | | | | | valeur_de_carte atout = function As _ → 11 Roi _ → 4 Dame _ → 3 Valet c → if c = atout then 20 else 2 Petite_carte (10, _) → 10 Petite_carte (9, c) → if c = atout then 14 else 0 | _ → 0 ;; valeur_de_carte : couleur → carte → int = <fun> Types produits et types sommes en CaML Polynômes pleins ou creux Quel type adopter pour modéliser des polynômes à coefficients entiers ? Solution 1 : int vect Et pour 1 + X 10000 ? Solution 2 : (int ? int) list Si un polynôme est plein (peu de coefficients nuls), la solution 1 est avantageuse car les exposants sont implicites. Si un polynôme est creux (beaucoup de coefficients nuls), la solution 2 est préférable. Types produits et types sommes en CaML Un exemple de type récursif On admet qu’un peinture est définie par : une teinte de base ... ou bien un mélange plusieurs teintes type teinte = | Cyan | Magenta | Jaune | Noir | Melange of (float ? teinte) list ;; Le type teinte est défini Types produits et types sommes en CaML Listes chaînées Une liste chaînée, c’est quoi ? liste chaînée vide, ou bien une cellule comportant deux entités : 1 2 V(0) des données un lien vers la cellule suivante V(1) ..... V(n−1) Types produits et types sommes en CaML Listes chaînées type ’a linked_list = | Nil | Cell of ’a * ’a linked_list;; Le type linked_list est défini. C’est un type somme, paramétré et récursif ! Types produits et types sommes en CaML Arbres binaires : un avant-goût type ’a tree = Nil | N of ’a tree * ’a * ’a tree;; → Type somme paramétré et récursif ! Types produits et types sommes en CaML Un exemple let un_arbre = N ( N(N(N(Nil,3,Nil), 2, N(Nil,4,Nil)), 1, N(Nil,5,Nil)), 0, N(N(Nil,7,Nil), 6, N(Nil,8,Nil)) );; un_arbre est une valeur de type int tree 0 1 6 2 5 3 7 8 4 Types produits et types sommes en CaML \˜b“y´e Types produits et types sommes en CaML