IIUC compiling this in older versions requires making the constraint `with type t = private Foo.t`. However, garrigue says this is not semantically correct and has deprecated this. Okay. Thanks. On Tue, Jan 28, 2014 at 4:43 PM, Gabriel Scherer wrote: > The change of behavior was part of PR#6090: > http://caml.inria.fr/mantis/view.php?id=6090 > It was a case of the type-checker refusing more programs than necessary. > > My understanding of the compatibility story of the type-system is that > future versions will not rule out semantically valid programs accepted > by previous ones (note that buggy programs previously accepted could > be ruled out), but may accept strictly more semantically valid > programs. If you need to be sure that your code compile under older > versions, you should test them explicitely. > > On Tue, Jan 28, 2014 at 10:19 PM, Ashish Agarwal > wrote: > > Is the following an expected change from OCaml 4.00.1 to 4.01.0? > > > > Module Foo defines a private type and this module is included in Common. > The > > signature within Common is defined using `module type of` with a > constraint. > > The different behavior shown below occurs when the private type is a > record, > > but not if it is a base type like string or int. In that case, the code > > compiles with both 4.00.1 and 4.01.0. > > > > $ cat a.ml > > module Foo : sig > > type t = private {a:int} > > end = struct > > type t = {a:int} > > end > > > > module Common : sig > > module F : module type of Foo with type t = Foo.t > > end = struct > > module F = Foo > > end > > > > $ ocaml -version > > The OCaml toplevel, version 4.01.0 > > > > $ ocaml a.ml > > (* no errors *) > > > > Now, change version of OCaml being used. > > > > $ ocaml -version > > The OCaml toplevel, version 4.00.1 > > > > $ ocaml a.ml > > File "a.ml", line 9, characters 6-33: > > Error: Signature mismatch: > > Modules do not match: > > sig module F : sig type t = Foo.t = private { a : int; } end end > > is not included in > > sig module F : sig type t = Foo.t = { a : int; } end end > > In module F: > > Modules do not match: > > sig type t = Foo.t = private { a : int; } end > > is not included in > > sig type t = Foo.t = { a : int; } end > > In module F: > > Type declarations do not match: > > type t = Foo.t = private { a : int; } > > is not included in > > type t = Foo.t = { a : int; } > > File "a.ml", line 8, characters 37-51: Expected declaration > > File "a.ml", line 2, characters 7-26: Actual declaration > > A private type would be revealed. > > >