Sommes
Définition
Le type somme est constitué de plusieurs constructeurs possédant eux-mêmes un paramètre propre. Les constructeurs doivent commencer par une majuscule. S'ils n'ont pas de paramètre, la somme est identique à une énumération. On peut par exemple construire un type pour définir une carte à jouer. On a d'abord besoin d'une énumération pour définier la couleur puis d'un type somme pour la carte :
# type couleur = Coeur | Pique | Carreau | Trefle;;
type couleur = Coeur | Pique | Carreau | Trefle
# type carte =
| As of couleur
| Roi of couleur
| Dame of couleur
| Valet of couleur
| Numero of int * couleur;;
type carte =
As of couleur
| Roi of couleur
| Dame of couleur
| Valet of couleur
| Numero of int * couleur
On peut alors déclarer des variables de type somme avec le constructeur suivi de ses paramètres :
# let carte1 = Valet Trefle;;
val carte1 : carte = Valet Trefle
# let carte2 = Numero (2, Coeur);;
val carte2 : carte = Numero (2, Coeur)
Filtrage
On peut effetuer un filtrage sur les sommes en utilisant des motifs.
On peut utiliser le motif _
comme motif générique.
Prenons par exemple le cas d'une fonction qui détermine si une carte est une figure :
# let est_une_figure = function
| Roi(c) -> true
| Dame(c) -> true
| Valet(c) -> true
| _ -> false;;
val est_une_figure : carte -> bool = <fun>
Exercices
1) Écrire une fonction qui renvoie la « valeur » d'une carte. Cette valeur correspond au numéro des cartes de 2 à 10 et ensuite l'As vaut 1, le valet 11, la Dame 12 et le roi 13.
2) Écrire un type nombre qui permet de représenter des nombres, aussi bien entiers que réels.
3) Créer des fonctions d'addition et de multiplication pour type nombre. On pourra utiliser la syntaxe suivante pour le filtrage sur deux paramètres de la fonction somme :
# let somme x y =
match (x,y) with
| …