Hi, There's something I'm not understanding about recursive modules. Consider the following distilled example: # module rec A : sig type t = It of ASet.t val compare : t -> t -> int val get : t -> ASet.t end = struct type t = It of ASet.t let compare = compare let get = function It(x) -> x end and ASet : sig type t val get_its_elements : t -> A.t list end = struct module C = Set.Make(A) type t = C.t let get_its_elements x = C.elements (A.get x) end ;; Characters 350-359: let get_its_elements x = C.elements (A.get x) ^^^^^^^^^ This expression has type ASet.t but is here used with type C.t = Set.Make(A).t # Why doesn't the typechecker know that ASet.t and C.t are the same type? Anyone know a workaround? This is with the 3.10.0 beta version, but seems to be the same back to 3.07. Cheers, Josh