Оптимизация хвостового вызова может быть устранена с помощью продолжения. Вот пример, где ключ и значение string
и int
соответственно
type Trie =
| Data of string * int * Trie * Trie
| Leaf
let Insert start key value =
let rec inner current withNode =
match current with
| Data (currentKey, currentValue, left, right) ->
if key < currentKey then
inner left (fun left -> Data (currentKey, currentValue, left, right))
else
inner right (fun right -> Data (currentKey, currentValue, left, right))
| Leaf -> withNode (Data (key, value, Leaf, Leaf))
inner start (fun x -> x)
Удаление копий будет немного сложнее, если вы хотите придерживаться неизменных структур