Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] module constraints bug?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ 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