Exercice 1
1.
#type quantité =
Pièce of int
| Kilo of float;;
Le type quantité est défini.
#type légume =
{ nom : string;
prix : float;
quantité : quantité;
seuil : quantité };;
Le type légume est défini.
#type rayon == légume list;;
Le type rayon est défini.
#type panier == (string * quantité) list;;
Le type panier est défini.
2.
#let vérifie_quantités q1 q2 =
match q1, q2 with
| Pièce _, Pièce _ -> true
| Kilo _, Kilo _ -> true
| _ -> false;;
vérifie_quantités : quantité -> quantité -> bool = <fun>
#let différence_entre_quantités q1 q2 =
match q1, q2 with
| Pièce p1, Pièce p2 -> Pièce (p1 - p2)
| Kilo l1, Kilo l2 -> Kilo (l1 -. l2)
| _ -> failwith "différence_entre_quantités: quantités de nature différentes";;
différence_entre_quantités : quantité -> quantité -> quantité = <fun>
#let inférieur_quantités q1 q2 =
match q1, q2 with
| Pièce p1, Pièce p2 -> p1 < p2
| Kilo l1, Kilo l2 -> l1 < l2
| _ -> failwith "inférieur_quantités: quantités de nature différentes";;
inférieur_quantités : quantité -> quantité -> bool = <fun>
3.
#type panier == (string * quantité) list;;
Le type panier est défini.
4.
#let rec info_légume nom rayon =
match rayon with
| [] -> failwith "Ce n'est pas la saison !"
| leg'::rayon' -> if leg'.nom=nom then leg' else info_légume nom rayon';;
info_légume : string -> légume list -> légume = <fun>
#let prix_légume nom rayon = (info_légume nom rayon).prix;;
prix_légume : string -> légume list -> float = <fun>
#let rec prix_panier panier rayon =
match panier with
| [] -> 0.0
| (nom, Pièce i) :: panier ->
(float_of_int i) *. (prix_légume nom rayon) +. prix_panier panier rayon
| (nom, Kilo l) :: panier ->
l *. (prix_légume nom rayon) +. prix_panier panier rayon;;
prix_panier : (string * quantité) list -> légume list -> float = <fun>
5.
#let rec mise_à_jour_légume nom quantité rayon =
match rayon with
| [] -> failwith "Ce n'est pas la saison !"
| leg::rayon' ->
if leg.nom = nom then
{ quantité = différence_entre_quantités leg.quantité quantité;
nom = leg.nom; prix = leg.prix; seuil = leg.seuil } :: rayon'
else
leg::(mise_à_jour_légume nom quantité rayon);;
mise_à_jour_légume : string -> quantité -> légume list -> légume list =
<fun>
#let rec mise_à_jour_panier panier rayon =
match panier with
| [] -> []
| (nom, quantité)::panier' ->
mise_à_jour_panier panier' (mise_à_jour_légume nom quantité rayon);;
mise_à_jour_panier : (string * quantité) list -> légume list -> 'a list
=
<fun>
6.
#let rec légumes_à_commander rayon =
match rayon with
| [] -> []
| {nom = n; quantité = q; seuil = s} :: rayon' ->
if inférieur_quantités q s
then (n, s)::(légumes_à_commander rayon')
else légumes_à_commander rayon';;
légumes_à_commander : légume list -> (string * quantité) list = <fun>
Ce document a été traduit de LATEX par
HEVEA.