(* TEST expect; *) type _ t = I : int t;; let f (type a) (x : a t) = let module M = struct let (I : a t) = x (* fail because of toplevel let *) let x = (I : a t) end in () ;; [%%expect{| type _ t = I : int t Line 5, characters 9-10: 5 | let (I : a t) = x (* fail because of toplevel let *) ^ Error: This pattern matches values of type "int t" but a pattern was expected which matches values of type "a t" Type "int" is not compatible with type "a" |}];; (* extra example by Stephen Dolan, using recursive modules *) (* Should not be allowed! *) type (_,_) eq = Refl : ('a, 'a) eq;; let bad (type a) = let module N = struct module rec M : sig val e : (int, a) eq end = struct let (Refl : (int, a) eq) = M.e (* must fail for soundness *) let e : (int, a) eq = Refl end end in N.M.e ;; [%%expect{| type (_, _) eq = Refl : ('a, 'a) eq Line 8, characters 10-14: 8 | let (Refl : (int, a) eq) = M.e (* must fail for soundness *) ^^^^ Error: This pattern matches values of type "(int, int) eq" but a pattern was expected which matches values of type "(int, a) eq" Type "int" is not compatible with type "a" |}];;