Dear list,
I apologize in advance as I believe this has been discussed already in some very close forms, such as in the thread "Narrowing a signature with a constrained type" or a few other threads too. The other examples I've found in the archives I thought were maybe slightly more involving (containing either some type variable, type paramters, an object type, or type variable constraints, etc.). So in the hope that what I am trying to do might be simpler, here goes:
module type A = sig
type t = int
val of_int : int -> t
end
module type B = sig
type t
include A with type t := t
end
File "/tmp/
a.ml", line 8, characters 10-28:
Error: In this `with' constraint, the new definition of t
does not match its original definition in the constrained signature:
Type declarations do not match:
type t = t
is not included in
type t = int
File "/tmp/
a.ml", line 2, characters 7-14: Expected declaration
File "/tmp/
a.ml", line 8, characters 17-28: Actual declaration
EXIT STATUS 2
$ ocamlopt -version
4.00.1
In a previous answer from Jacques Garrigue I read that
> to ensure the coherence of the with constraints, we require that
> the new signature be a subtype of the original one (as a module, not as an object).
> This is where your code gets rejected.
In the example, I am not sure what exactly are the signatures involved in the comparison, since the included signature does not contain the definition of the type t ( removed by the use of := ), and without the type [t] the signature are virtually identical.
I've used the following workaround [1], however I was just wondering what was the reason behind the rejection.
Thanks,
Mathieu.
[1]
module type S = sig
type t
val of_int : int -> t
end
module type A = sig
type t = int
include S with type t := t
end
module type B = sig
type t
include S with type t := t
end