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