Programmation fonctionnelle
Cours 12 : Correction du CC2
Révisions
Licence 1
Année 2016 –2017
Par N. VINCENT
# let rec present l nom = match l with [] ->
| (no , va) :: t -> if no = nom then
else present tnom ;;
Licence 1 -programmation fonctionnelle 2
Exercice 1-1
Ecrire une fonction booléenne present qui aura deux arguments, une
liste de mesures nommée let une chaîne de caractères nommée nom
représentant le nom d’un expérimentateur. Cette fonction indique si
l’expérimentateur a effectué une mesure contenue dans la liste l.
[("luc",10);("lea",12);("agathe",14);("lea",8);("louis",22);("louis",13);
("lea",18)]
# let rec present l nom = match l with [] -> false
| (no , va) :: t -> if no = nom then true
else present tnom ;;
val present : ('a* 'b) list -> 'a-> bool = <fun>
# present [("luc",10);("lea",12);("agathe",14);("lea",8);("louis",22);("louis",13);
("lea",18)] "lea" ;;
-: bool = true
# present [("luc",10);("lea",12);("agathe",14);("lea",8);("louis",22);("louis",13);
("lea",18)] "martin" ;;
-: bool = false
# let rec fcompte l nom = match l with [] -> 0
|(no , va) :: t -> if no = nom then 1 + fcompte tnom
else fcompte tnom ;;
val fcompte : ('a* 'b) list -> 'a-> int = <fun>
# fcompte li "lea" ;;
-: int = 3
Licence 1 -programmation fonctionnelle 3
Exercice 1-2
Ecrire une fonction fcompte qui aura deux arguments, une liste de
mesures nommée let une chaîne de caractères nommée nom
représentant le nom d’un expérimentateur. Cette fonction calcule le
nombre de mesures effectuées par l’expérimentateur dont le nom est
le second argument.
[("luc",10);("lea",12);("agathe",14);("lea",8);("louis",22);("louis",13);
("lea",18)]
# let fcompte l nom = let rec faux acc ll name =
match ll with [] -> acc
|(no , va) :: t -> if no = name then faux (1 + acc) tname
else faux acc tname
in faux 0 l nom ;;
val fcompte : ('a * 'b) list -> 'a -> int = <fun>
# fcompte li "lea" ;;
-: int = 3
# let fcompte2 l nom1 nom2 = (fcompte l nom1 , fcompte l nom2)
Licence 1 -programmation fonctionnelle 4
Exercice 1-3
Ecrire une fonction fcompte2 qui à partir d’une liste de mesures fournie
en argument et de deux autres arguments, des chaînes de caractère,
calcule un couple contenant respectivement le nombre de mesures de
chaque expérimentateur.
[("luc",10);("lea",12);("agathe",14);("lea",8);("louis",22);("louis",13);
("lea",18)]
# fcompte2 li "luc" "lea" ;;
-: int * int = (1, 3)
# let fcompte2 l nom1 nom2 = let rec faux acc1 acc2 ll name1 name2 =
match ll with [] -> acc1 , acc2
|(name1 , va) :: t -> faux (1 + acc1) acc2 tname1 name2
| (name2 , va) :: t -> faux acc1 (1 + acc2) tname1 name2
| h :: t -> faux acc1 acc2 tname1 name2
in faux 0 0 l nom1 nom2 ;;
Warning 11: this match case is unused.
Warning 11: this match case is unused.
val fcompte2 : ('a * 'b) list -> 'a -> 'a -> int * int =
<fun>
# fcompte2 li "luc" "lea" ;;
-: int * int = (7, 0)
Licence 1 -programmation fonctionnelle 5
Exercice 1-3
Ecrire une fonction fcompte2 qui à partir d’une liste de mesures fournie
en argument et de deux autres arguments, des chaînes de caractère,
calcule un couple contenant respectivement le nombre de mesures de
chaque expérimentateur.
[("luc",10);("lea",12);("agathe",14);("lea",8);("louis",22);("louis",13);
("lea",18)]
# let fcompte2 l nom1 nom2 = let rec faux acc1 acc2 ll name1 name2 =
match ll with [] -> acc1 , acc2
|(no , va) :: t -> if no = name1 then faux (1 + acc1) acc2 tname1 name2
else if no = name2 then faux acc1 (1 + acc2) tname1 name2
else faux acc1 acc2 tname1 name2
in faux 0 0 l nom1 nom2 ;;
val fcompte2 : ('a * 'b) list -> 'a -> 'a -> int * int = <fun>
# fcompte2 li "luc" "lea" ;;
-: int * int = (1, 3)
# let rec mesure l nom = match l with [] -> []
| (nom , va) :: t -> va :: mesure tnom
| _:: t -> mesure tnom ;;
Licence 1 -programmation fonctionnelle 6
Exercice 1-4
Ecrire une fonction mesure qui aura pour arguments une liste de
mesures nommée let une chaîne de caractères nommée nom qui
représente le nom d’un expérimentateur. Cette fonction doit créer la
liste des mesures réalisées par l’expérimentateur nom .
[("luc",10);("lea",12);("agathe",14);("lea",8);("louis",22);("louis",13);
("lea",18)]
# let mesure l nom = let rec faux acc ll name =
match ll with [] -> acc
|(no , va) :: t -> if no = nom then faux (acc@ [va]) tname
else faux acc tname
in faux [] l nom ;;
# mesure li "lea" ;;
-: int list = [10; 12; 14; 8; 22; 13; 18]
# let rec mesure l nom = match l with [] -> []
| (no , va) :: t -> if no = nom then va :: mesure tnom
else mesure tnom ;; # mesure li "lea" ;;
-: int list = [12; 8; 18]