Programmation impérative : références et boucles
Cours · OCaml (option informatique), chapitre 4 · prépas MPSI et MP, option informatique · le début du chapitre, la suite sur Adloun
4.1 Introduction et motivation
OCaml n'est pas un langage purement fonctionnel : il offre aussi un style impératif, où l'on modifie l'état de la machine au fil du temps. Pourquoi s'en servir alors que la récursion suffit ? Parce que certains calculs s'expriment plus naturellement par une boucle et une variable qui évolue : compter, accumuler, itérer un nombre connu de fois. Le programme officiel le souligne toutefois : les références doivent être utilisées à bon escient. On ne renonce pas au style fonctionnel ; on ajoute un outil, qu'on emploie là où il clarifie.
Ce chapitre présente les briques de l'impératif en OCaml : la notion d'effet et le type unit, la séquence, les références (la seule forme de variable modifiable vue ici), et les deux boucles while et for. On retrouvera, transposé aux boucles while, l'outil de validation déjà central en Python : le variant, qui prouve qu'une boucle se termine.
4.2 Effets, unit et séquence
En OCaml, il n'y a pas d'instruction au sens de Python : tout est expression. Une expression évaluée pour son effet (afficher, modifier une case mémoire) et non pour sa valeur a le type unit, dont l'unique valeur est notée ().
# print_string "Bonjour";;
Bonjour- : unit = ()
Les fonctions d'affichage print_int : int -> unit, print_string : string -> unit et print_float : float -> unit produisent un effet (l'écriture à l'écran) et renvoient (). Ce sont des fonctions « à effet », typiques de l'impératif.
4.2.1 La séquence
Pour enchaîner deux expressions, on les sépare par un point-virgule ; : l'expression e1 ; e2 évalue e1 (pour son effet — e1 doit être de type unit), puis e2, et sa valeur est celle de e2.
let saluer () =
print_string "Bonjour, ";
print_string "le monde";
print_newline ()
Ne pas confondre les trois points-virgules d'OCaml : ; (séquence entre expressions), ; séparateur d'éléments de liste ([1; 2; 3]), et ;; (fin de phrase au toplevel). Le contexte les distingue, mais c'est une source d'erreurs au début. Si e1 dans e1 ; e2 n'est pas de type unit, le compilateur émet un avertissement : sa valeur serait jetée.
Exercices du chapitre
- PGCD impératif corrigé
- Fibonacci itératif corrigé
- Compter les diviseurs corrigé
- Suite de Syracuse corrigé
- Racine carrée entière corrigé
- Test de primalité corrigé