Académique Documents
Professionnel Documents
Culture Documents
1 Destinations postales
On définit:
type desination =
| Departement of int (* n◦ , ex: 37 pour Indre et Loire *)
| Etranger of string (* nom du pays *)
2. Écrire une fonction pays: destination -> string qui donne le nom
de pays correspondant à une destination ("France") pour la France
1
2 Noms de fichiers
On souhaite représenter des noms de fichier, sans risquer de les confondre
avec des chaînes. Pour cela on utilise un type algébrique à un seul cas:
type file = File of string
4 Unités de longueur
On définit le type « unité de longueur »
type unite = Metre | KM | Pied | Pouce
2
et le type « mesure de longueur munie d’une unité »
type mesure = Mesure of float * unite
1. Écrire une fonction valeur: unite -> float qui donne la valeur
d’une unité en mètres. Rappel: 1 pouce = 2,54 cm; 1 pied = 12 pouces.
2. Écrire une fonction metres: mesure -> float qui convertit une
mesure de longueur en mètres.
3. Écrire une fonction conversion: float -> unite -> mesure qui
convertit une longueur exprimée en mètres dans une certaine unité.
4. Écrire une fonction somme: mesure -> mesure -> mesure qui calcule
la somme de 2 mesures de longueurs, en convertissant en mètres si les
unités sont différentes.
Voir l’exercice « Grandeurs physiques » pour une méthode garantissant
à la compilation que les unités sont les mêmes.
5 Grandeurs physiques
On considère des grandeurs physiques, par exemple: longueur, surface,
volume, etc.
Il est essentiel de ne pas confondre les différentes grandeurs quand on les
ajoute: c’est le critère d’« homogénéité ». Par exemple, il est incohérent
d’ajouter des litres et des mètres. Le but de l’exercice est de voir une méthode
infaillible pour y parvenir.
On commence par définir ces types:
type longueur = Longueur
type surface = Surface
type volume = Volume
Ces types sont triviaux, isomorphes à unit: leurs valeurs ne transportent
aucune information. Mais ces types portent des noms différents, donc ils sont
non interchangeables.
3
Maintenant on définit le type « grandeur physique homogène à un certain
type »
type ’a grandeur = Grandeur of float
Aucune valeur de type ’a n’est exploitée, mais on a plusieurs grandeurs
physiques de types différents: longueur grandeur, surface grandeur,
volume grandeur.
On définit (manuellement et avec des noms différents) des fonctions pour
multiplier des grandeurs:
let longueur_longueur (Grandeur x: longueur grandeur)
(Grandeur y: longueur grandeur) =
(Grandeur (x *. y): surface grandeur)
4
6 Valeurs optionnelles
Voici le type prédéfini en ML pour une valeur optionnelle:
type ’a option = Some of ’a | None
1. Écrire une fonction moitie: int -> int option telle que moitie n
donne, s’il existe, l’entier m tel que 2m = n.
2. Écrire une fonction lift: (’a -> ’b) -> (’a option -> ’b
option) qui transforme une fonction sur les valeurs en fonction
sur les options. Par exemple, string_of_int: int -> string est
une fonction qui prend un entier et qui calcule une chaîne, donc
lift string_of_int: int option -> string option doit être une
fonction qui prend une option sur un entier et qui donne une option
sur une chaîne.
3. Écrire une fonction bind: (’a -> ’b option) -> (’a option ->
’b option) qui transforme une fonction au résultat optionnel en fonc-
tion sur les options. Par exemple, moitie: int -> int option prend
un entier et calcule une option, donc bind moitie: int option ->
int option prend une option et calcule une option.
5
8 Fichiers et dossiers
On définit une arborescence de fichiers par ce type: un élément de
l’arboresence est soit un stock de données (peu importe lesquelles) soit un
dossier/répertoire contenant d’autres sous-arborescences.
type arborescence =
| Fichier of string (* nom, peu importe le contenu *)
| Dossier of string * arborescence list (* nom, contenu *)
6
9 Puissance
Effectuer l’exercice supplémentaire « Puissance efficace », partie A: « Puis-
sance par multiplications ».
10 PGCD
Effectuer l’exercice supplémentaire « PGCD et coefficients de Bézout ».
11 Grands entiers
Effectuer l’exercice supplémentaire « Manipulation de grands entiers »,
questions fact et pgcd. On utilisera [probablement] la version avec
ersatz_arith, en version interactive.
Effectuer l’exercice supplémentaire « Puissance efficace », partie B: « Puis-
sance modulaire ».
12 Fibonacci
Effectuer l’exercice supplémentaire « Suite de Fibonacci ».