Types produits et types sommes en CaML - INFO-MPSI

publicité
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
Téléchargement