(* Standard types *) type ['a;'b]pair = Pair <'a,'b> ;; type ['a;'b]sum = Inl <'a> | Inr <'b> ;; type 'a tree = Leaf | Node <'a,left:'a tree,right:'a tree> ;; (* Matching on constructors #let leaf = Node left:Leaf right:Leaf;; leaf : <'a> -o 'a tree = #let t = Node 1 left:(leaf 2) right:(leaf 3);; t : int tree = (Node 1 left:(Node 2 left:Leaf right:Leaf) right:(Node 3 left:Leaf right:Leaf)) #;; it : = <1,left:(Node 2 left:Leaf right:Leaf), right:(Node 3 left:Leaf right:Leaf)> #let left (Node left:x|_) = x;; left : <'a tree> -o 'a tree = #left t;; it : int tree = (Node 2 left:Leaf right:Leaf) *)