Un modelo funcional utilizando el tipo de opción:
Cuando tenga que cambiar partes de una estructura de datos recursiva, como un árbol o una lista, que se desee reutilizar tanto de la estructura de los datos existentes como posible. La opción tipo puede ayudarlo con esto. Estas dos funciones reemplazan todas las ocurrencias del número 5 con 7, pero la primera copia el árbol completo. El segundo no.
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
Puede que no sea necesario en todos los casos, pero es una buena técnica para saber.