1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #type comparison = Less | Equal | Greater;;
type comparison = Less | Equal | Greater
#module type ORDERED_TYPE =
sig
type t
val compare: t -> t -> comparison
end;;
module type ORDERED_TYPE = sig type t val compare : t -> t -> comparison end
#module Tree =
functor (Elt: ORDERED_TYPE) ->
struct
type 'a tree = Empty | Node of 'a * 'a tree * 'a tree
let empty = Empty
let rec insert tree elt =
match tree with
Empty -> Node(elt, Empty, Empty)
| Node(e, left, right) ->
if Elt.compare elt e = Less
then Node(elt, insert right e, left)
else Node(e, insert right elt, left)
exception Tree_is_empty
let rec remove_top = function
Empty -> raise Tree_is_empty
| Node(elt, left, Empty) -> left
| Node(elt, Empty, right) -> right
| Node(elt, (Node(lelt, _, _) as left),
(Node(relt, _, _) as right)) ->
if Elt.compare lelt relt = Less
then Node(lelt, remove_top left, right)
else Node(relt, left, remove_top right)
let extract = function
Empty -> raise Tree_is_empty
| Node(elt, _, _) as tree -> (elt, remove_top tree)
end;; |
Partager