Un modèle fonctionnel en utilisant le type d'option:
Lorsque vous avez besoin de changer des parties d'une structure de données récursive, comme un arbre ou une liste, vous voudrez réutiliser autant de la structure de données existantes possible. Le type d'option peut vous aider avec ceci. Ces deux fonctions remplacent toutes les occurrences du nombre 5 par 7, mais le premier copie l'arbre entier. Le second ne le fait pas.
type Tree = Leaf of int
| Node of Tree * Tree
let rec replace_no_sharing tree =
match tree with
| Leaf 5 -> Leaf 7
| Leaf x -> Leaf x
| Node (a, b) -> Node (replace_no_sharing a, replace_no_sharing b)
let replace_with_sharing tree =
let rec replace_option tree =
match tree with
| Leaf 5 -> Leaf 7 |> Some
| Leaf x -> None
| Node (a, b) -> match replace_option a, replace_option b with
| None, None -> None
| Some a, Some b -> Node (a, b) |> Some
| Some a, None -> Node (a, b) |> Some
| None, Some b -> Node (a, b) |> Some
match replace_option tree with
| None -> tree
| Some tree -> tree
Il pourrait ne pas être nécessaire dans tous les cas, mais il est une belle technique de savoir.