module LexicographicOrder = functor (Ord1: sig type t val equal: t->t->bool val less: t->t->bool end) functor (Ord2: sig type t val equal: t->t->bool val less: t->t->bool end) struct type t = Ord1.t * Ord2.t val equal p q = if Ord1.equal (fst p) (fst q) then Ord2.equal (snd p) (snd q) else false val less p q = if Ord1.less (fst p) (fst q) then true else if Ord1.equal (fst p) (fst q) then Ord2.less (snd p) (snd q) else false end ;; module NatOrder = struct type t = nat val equal x y = x == y val less x y = x < y end ;; module NatPairOrder = LexicographicOrder(NatOrder)(NatOrder)