Trois lignes, trois effets
Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 6 — Types et structures de données abstraites
É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) <- 77Corrigé
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|]
l1est intacte. Une liste est immuable :0 :: l1ne modifie rien, elle fabrique un maillon neuf dont la queue estl1. Les deux listes partagent trois maillons, et ce partage est sans danger précisément parce que personne ne peut les modifier.t1vaut[|99;2;3|]. La lignelet t2 = t1ne copie rien : elle donne un second nom au même tableau. Écrire par l'un, c'est écrire par l'autre.t3est bien une copie : la modification det3.(1)laisset1tranquille.
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.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.