Licence 1 -programmation fonctionnelle 13
Type nombre
On peut définir un type compatible réel et entier
# type t_nombre = Reel of float | Entier of int ;;
type t_nombre = Reel of float | Entier of int
# let v1 = Entier 5 and v2 = Entier (-3) and v3 = Reel 4. and v4 = Reel 2.5 ;;
val v1 : t_nombre = Entier 5
val v2 : t_nombre = Entier (-3)
val v3 : t_nombre = Reel 4.
val v4 : t_nombre = Reel 2.5
Ils ont tous le même type
Mais aucun opérateur n’est prévu
Licence 1 -programmation fonctionnelle 14
Type nombre
On doit définir des opérations
# type t_nombre = Reel of float | Entier of int ;;
type t_nombre = Reel of float | Entier of int
# somme v1 v2 ;;
-: t_nombre = Entier 2
# somme v1 v3 ;;
-: t_nombre = Reel 9.
somme
# let somme x y = match (x,y) with | (Reel x1 , Reel x2) -> Reel (x1 +. x2)
| (Reel x1 , Entier x2) -> Reel (x1 +. float_of_int (x2))
| (Entier x1 , Entier x2) -> Entier (x1 + x2)
| (Entier x1 , Reel x2) -> Reel (float_of_int(x1) +. x2) ;;
val somme : t_nombre -> t_nombre -> t_nombre = <fun>
# somme v3 v4 ;;
-: t_nombre = Reel 6.5
# somme v4 v2 ;;
-: t_nombre = Reel (-0.5)
# let v1 = Entier 5 and v2 = Entier (-3) and v3 = Reel 4. and v4 = Reel 2.5 ;;
# let add (x,y) (z,t) = (x+z , y+t) ;;
val add : int * int -> int * int -> int * int = <fun>
# add (5,4) (0,1) ;;
-: int * int = (5, 5)
Licence 1 -programmation fonctionnelle 15
Exercice 2-1
Une liste contient une série temporelle de mesures qui sont soit des
mesures de température, soit des mesures de hauteur. Ses
éléments sont de type t_mesure défini par :Type t_mesure =
|Temp of int |Haut of int ;;
1°/ Ecrire une fonction add qui calcule terme à terme la somme de
deux couples d’entiers.
Licence 1 -programmation fonctionnelle 16
Exercice 2-2
2°/Ecrire une fonction fcompte qui à partir d’une liste de mesures de type
t_mesure, calcule un couple contenant respectivement les nombres de
mesures des températures et des hauteurs contenues dans la liste de
mesures.
# let x = [Te mp 3 ; Temp 2 ; Haut 2 ; Te mp 2 ; Haut 4] ;;
val x : t_mesure list = [Tem p 3; Temp 2; Haut 2; Temp 2; Haut 4]
# let rec fcompte l = match l with [] -> (0,0)
| (Temp x) :: t -> add (fcompte t) (1,0)
| (Haut x) :: t -> add (fcompte t) (0,1) ;;
val fcompte : t_mesure list -> int * int = <fun>
Type t_mesure = |Temp of int |Haut of int ;;
# fcompte x ;;
-: int * int = (3, 2)
Licence 1 -programmation fonctionnelle 17
Exercice 2-3
3°/ Ecrire une fonction fmoy qui à partir d’une liste de mesures de
type t_mesure, calcule un couple contenant respectivement les
moyennes des températures et des hauteurs contenues dans la
liste de mesures.
# let fmoy l = let rec fsom ll = match ll with [] -> (0,0)
| (Temp x) :: t -> add (fsom t) (x,0)
| (Haut x) :: t -> add (fsom t) (0,x)
in let (n1,n2) = fcompte l
in let (s1,s2) = fsom l
in (float_of_int s1) /. (float_of_int n1) ,
(float_of_int s2) /. (float_of_int n2) ;;
val fmoy : t_mesure list -> float * float = <fun>
# let x = [Temp 3 ; Temp 2 ; Haut 2 ; Temp 2 ; Haut 4] ;;
val x : t_mesure list = [Te m p 3; Temp 2; Haut 2; Temp 2; Haut 4]
# fmoy x ;;
-: float * float = (2.33333333333333348, 3.)
Type t_mesure = |Temp of int |Haut of int ;;
Licence 1 -programmation fonctionnelle 18
Exercice 2-4
4°/ Ecrire une fonction fmax qui à partir d’une liste de mesures de
type t_mesure, calcule un couple contenant respectivement les
valeurs maximum des températures et des hauteurs contenues dans
la liste de mesures. On vérifiera que la liste comporte au moins une
mesure de hauteur et une mesure de température, sinon une
exception indiquera ce cas.
let fmax l = let (n1,n2) = fcompte l
in if n2<1 && n1<1 then invalid_arg "pas de measures"
else
val fmax : t_mesure list -> int * int = <fun>
let fmax l = let (n1,n2) = fcompte l
in if n2<1 && n1<1 then invalid_arg "pas de measures"
else let rec ft ll = match ll with | (Te m p x) :: t -> x
| (Haut x) :: t -> ft t
| [ ] -> 0
in let rec fh ll = match ll with | (Te m p x) :: t -> fh t
| (Haut x) :: t -> x
| [ ] -> 0
in let rec ffmax acc1 acc2 ll =
match ll with [Tem p x] -> (max x acc1, acc2)
| [Haut x] -> (acc1 , max x acc2)
| (Tem p x) :: t -> ffmax (max x acc1) acc2 t
| (Haut x) :: t -> ffmax acc1 (max x acc2) t
| [ ] -> (acc1 , acc2)
in ffmax (ft l) (fh l) l ;;
val fmax : t_mesure list -> int * int = <fun>
# let x = [Tem p 3 ; Te m p 2 ; Haut 2 ; Te m p 2 ; Haut 4] ;;
val x : t_mesure list = [Tem p 3; Tem p 2; Haut 2; Te mp 2; Haut 4]
# fmax x ;;
-: int * int = (3, 4)
Type t_mesure = |Temp of int |Haut of int ;;