F# deep clone and recursive merge for trees

F#
type Json =
    | Null
    | Bool of bool
    | Num of float
    | Str of string
    | Arr of Json list
    | Obj of Map<string, Json>

let rec clone value =
    match value with
    | Arr xs -> Arr(List.map clone xs)
    | Obj m -> Obj(Map.map (fun _ v -> clone v) m)
    | leaf -> leaf

let rec merge baseValue overrideValue =
    match baseValue, overrideValue with
    | Obj a, Obj b ->
        b |> Map.fold (fun acc k v ->
            let merged = match Map.tryFind k acc with Some old -> merge old v | None -> clone v
            Map.add k merged acc) a |> Obj
    | _, v -> clone v