Adloun

informatique (MP2I/MPI) · Chapitre 6 · Application directe du cours

Trois lignes, trois effets

Types et structures de données abstraites · niveau 2

Énoncé

Que valent l1, t1 et t3 après ces lignes ? Justifier chaque réponse par la mutabilité ou l'immuabilité de la structure en jeu.


let l1 = [1; 2; 3]
let l2 = 0 :: l1

let t1 = [| 1; 2; 3 |]
let t2 = t1
let () = t2.(0) <- 99

let t3 = Array.copy t1
let () = t3.(1) <- 77

Corrigé

Mesuré :


l1 = [1;2;3]          l2 = [0;1;2;3]
apres t2.(0) <- 99 :  t1 = [|99;2;3|]   t2 = [|99;2;3|]
apres t3.(1) <- 77 :  t1 = [|99;2;3|]   t3 = [|99;77;3|]
  • l1 est intacte. Une liste est immuable : 0 :: l1 ne modifie rien, elle fabrique un maillon neuf dont la queue est l1. Les deux listes partagent trois maillons, et ce partage est sans danger précisément parce que personne ne peut les modifier.
  • t1 vaut [|99;2;3|]. La ligne let t2 = t1 ne copie rien : elle donne un second nom au même tableau. Écrire par l'un, c'est écrire par l'autre.
  • t3 est bien une copie : la modification de t3.(1) laisse t1 tranquille.

La règle en une phrase : l'immuabilité achète le partage gratuit. Ce qui coûte, dans le monde mutable, ce n'est pas la modification, c'est la copie défensive qu'il faut faire avant de confier une structure à quelqu'un d'autre.

Et un avertissement sur Array.copy : la copie est superficielle. Si les cases contiennent elles-mêmes des tableaux, ce sont les mêmes tableaux qui se retrouvent dans la copie. C'est mesuré au neuvième exercice.

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre