next up previous contents index
Next: Types abréviations Up: Quelques éléments de Caml Previous: Types sommes: unions

Types produits: enregistrements

      Les enregistrements (records en anglais) permettent de regrouper des informations hétérogènes. Ainsi, on déclare un type date comme suit:

type mois =
 | Janvier | Février | Mars | Avril | Mai | Juin | Juillet
 | Aout | Septembre | Octobre | Novembre | Décembre;;

type date = {j: int; m: mois; a: int};;

let berlin = {j = 10; m = Novembre; a = 1989}
and bastille = {j = 14; m = Juillet; a = 1789};;

Un enregistrement contient des champs de type quelconque, donc éventuellement d'autres enregistrements. Supposons qu'une personne soit représentée par son nom, et sa date de naissance; le type correspondant comprendra un champ contenant un enregistrement de type date:

type personne = {nom: string; naissance: date};;

let poincaré =
 {nom = "Poincaré"; naissance = {j = 29; m = Avril; a = 1854}};;

  Les champs d'un enregistrement sont éventuellement mutables, c'est-à-dire modifiables par affectation. Cette propriété est spécifique à chaque champ et se déclare lors de la définition du type, en ajoutant le mot clé mutable devant le nom du champ. Pour modifier le champ label du record r en y déposant la valeur v, on écrit r.label <- v.

 

#type point = {mutable x : int; mutable y : int};;
Le type t est défini.
#let origine = {x = 0; y = 0};;
origine : point = {x = 0; y = 0}
#origine.x <- 1;;
- : unit = ()
#origine;;
- : point = {x = 1; y = 0}

En combinaison avec les types somme, les enregistrements modélisent des types de données complexes:    

type complexe =
   | Cartésien of cartésiennes
   | Polaire of polaires

and cartésiennes = {re: float; im: float}
and polaires = {rho: float; theta: float};;

let pi = 4.0 *. atan 1.0;;

let x = Cartésien {re = 0.0; im = 1.0}
and y = Polaire {rho = 1.0; theta = pi /. 2.0};;

Une rotation de $\pi/2$ s'écrit alors:

let rotation_pi_sur_deux = function
  | Cartésien x -> Cartésien {re = -. x.im; im = x.re}
  | Polaire x -> Polaire {rho = x.rho; theta = x.theta +. pi /. 2.0};;



1/11/1998