Cours alternatif d’OCaml

Logo OCaml
III — Modéliser des données

Entraînement

Voici un petit quiz pour voir si vous avez compris le chapitre sur les types. Comme pour ceux d’avant, vos réponses deviendront vertes dès qu’elles sont justes.

On définit ces types :

(* On modélise un emploi du temps *)

type ue =
  | Inf201
  | Inf203
  | Mat201
  | Mat203
  | Phy201
  | Phy202
  | Pause

type horaire = int * int (* heure et minute *)
type cours = horaire * horaire * ue (* heure de début et de fin, UE *)

Quel est le type des expressions suivantes (seule la version la plus « simple » sera acceptée) ?

Mat201
((13, 30), (15, 00), Inf201)
(13, 30, 00)
'Z'
(15, 32)

Que faut-il écrire à la place des ______ pour que ce code soit correct ?

type tram = A | B | C | D | E
type transport =
  | Bus of int (* numero de ligne *)
  | Tram of ______
  | ______
  | ______

let nom_tram (t : tram) : string =
  match t with
  | A -> "A"
  | B -> "B"
  | C -> "C"
  | D -> "D"
  | E -> "E"

let nom_transport (tra : transport) : string =
  match tra with
  | Bus(ligne) -> "Ligne " ^ (string_of_int ligne) ^ " de bus"
  | Tram(t) -> "Tram " ^ (nom_tram t)
  | Voiture -> "Voiture"
  | Velo -> "Velo"

Puis :

Et enfin :

On va modéliser une collection de musique. Pour ça on va créer les types suivants : `musique`, `genre`, `album`, `type_album` (Single, EP, ou album). Je vous laisse libre de faire ce que vous voulez, mais essayez de faire des types les plus complets possibles. Vous pouvez aussi ajouter des types en plus (`artiste` par exemple) si vous avez envie.

Proposition de correction
type genre =
  | Classique
  | Electro
  | KPop
  | Pop
  | Rap
  | RnB
  | Rock

type artiste = string (* Le nom de l'artiste *)

type type_album = Single | EP | Album

type album = artiste * type_album * string (* le string est le nom de l'album *)

type musique = string * genre * album * artiste

(* On peut aussi définir album et musique avec des types structurés si on veut : *)
type album = {
  alb : album;
  alb_type : type_album;
  nom : string;
}

type musique = {
  titre : string;
  genre : genre;
  alb : album;
  art : artiste;
}

Je vous propose de continuer en écrivant des fonctions pour manipuler ces types.

Proposition de correction
let meme_album (a : musique) (b : musique) : bool =
  let (_, _, alb_a, _) = a in
  let (_, _, alb_b, _) = b in
  alb_a = alb_b

let meme_genre (a : musique) (b : musique) : bool =
  let (_, genre_a, _, _) = a in
  let (_, genre_b, _, _) = b in
  genre_a = genre_b

let long_titre (m : musique) : bool =
  let (titre, _, _, _) = m in
  (String.length titre) > 20

(* Si vous avez utilisé des types structurés vous pouvez faire : *)
let meme_album (a : musique) (b : musique) : bool =
  a.alb = b.alb

let meme_genre (a : musique) (b : musique) : bool =
  a.genre = b.genre

let long_titre (m : musique) : bool =
  (String.length m.titre) > 20