[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Xavier Leroy <Xavier.Leroy@i...> |
| Subject: | Re: [Caml-list] module constraints bug? |
> There seems to be a bug in the way o'caml handling higher-order modules > with constrained module arguments. It's not a bug, it's the intended behavior of the "SIG with module A = M" construct. But I understand that in your particular example, this behavior is not what you want! "SIG with module A = M" means: take signature SIG and replace the entry "module A : ..." in it with "module A : <principal signature of M>". In your example: > module ThisF: F = > struct > module A = > struct > type t = Pink | Blue > end > > module Eta = functor (X: SELF with module Self = A) -> > struct > let t2t x = match x with A.Pink -> A.Blue | A.Blue -> A.Pink > end > end the principal signature of A is sig type t = A.t = Pink | Blue end (a type t with two constructors Pink and Blue, and that is equal to A.t). Hence, SELF with module Self = A expands to sig module Self : sig type t = A.t = Pink | Blue end end instead of what you expected: sig module Self : sig type t = A.t end end and which corresponds to the non-principal signature for A sig type t = A.t end > However, if we change the module constraint to a type constraint > in the definition of Eta, as shown below in module ThatF, > [i.e. SELF with type Self.t = A.t] > then it will type-check. Yes, because "SELF with type Self.t = A.t" expands to what you expect: sig module Self : sig type t = A.t end end Hope this makes the issue a bit clearer, - Xavier Leroy ------------------- Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr