type 'a btree = | Leaf of 'a | Branch of ('a btree) * ('a btree) let rec flatten = function | Leaf(a) -> [a] | Branch(r, l) -> flatten r @ flatten l let _ = Branch(Leaf "a", Branch(Leaf "b", Leaf "c")) |> flatten |> List.iter (Printf.printf "%s ") ;