Next: Types abréviations
Up: Quelques éléments de Caml
Previous: Types sommes: unions
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 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};;