Effets de bord

Considérez l'expressions suivante :

carre 2 + carre 10

Qu'est-ce qui est executé avant : carre 2 ou carre 10 ?

Et comment le vérifier ?

Une fonction qui n'a aucun effet sur son environement est appelée pure. Dans ce cas là, l'ordre d'execution n'a pas d'importance, ce qui est un très grand avantage.

Sinon, on dit qu'elle a des effets de bord.

  • Écrire sur la sortie standard,
  • Lire sur l'entrée standard,
  • Écrire ou lire un fichier,
  • Renommer un fichier ou un dossier
  • Envoyer un paquet réseau

Imprimer des caractères

OCaml possède des librairies semblables à printf pour imprimer à l'écran, mais nous allons nous restreindre à des fonctions plus basiques.

Le type unit

#show unit ;;

Le type unit est un type qui n'a qu'une valeur possible : (). Il sert au fonction qu'un souhaiteraient ne rien retourner car leur unique but est de faire un effet de bord.

Retour aux sources

Considérez l'expressions suivante :

carre 2 + carre 10

Qu'est-ce qui est executé avant : carre 2 ou carre 10 ?

Manipuler le type unit

let scope =
  let _ignored_returned_value = print_string "Hello world" in
  ...
let scope =
  let () = print_string "Hello world" in
  ...
let scope =
  print_string "Hello world" ;
  ...

Exercices sur l'impression de valeurs

Structures de données mutables

Un autre effet de bord possible est la mutation de structures de données mutables.

Sauf mention explicite, les structures de données fonctionnelles ne sont pas mutables !

Nous allons voir deux structures de données mutables : les tableaux et les références.

Tableaux

Les tableaux sont une structure de donnée classique en programmation impérative.

let mon_tableau = [| 1; 2; 3 |]
let x = mon_tableau.(1)
let () = mon_tableau.(1) <- 5
let y = mon_tableau.(1)

Quelle valeur à x à ligne 2 ? Quelle valeur à y ? Quelle valeur à x à ligne 4 ?

val Array.make : int -> 'a -> 'a array
val Array.init : int -> (int -> 'a) -> 'a array

Références

Une référence est similaire à un tableau qui ne pourrait contenir qu'une seule entrée.

let reference = ref 5

let x = !reference

let () = reference := 10

let y = !reference
let reference = ref 5

let reference_2 = reference

let () = reference := 10

let y = !reference_2

Exercices sur les tableaux et les références