caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* functor substitution gives error
@ 2010-09-06  9:12 Hendrik Tews
  2010-09-06  9:39 ` [Caml-list] " Daniel Bünzli
  2010-09-07 10:48 ` Jacques Garrigue
  0 siblings, 2 replies; 6+ messages in thread
From: Hendrik Tews @ 2010-09-06  9:12 UTC (permalink / raw)
  To: caml-list

Hi,

I have a strange compilation problem, which I suspect to be a
compiler bug. Consider the following nested functor application


module A(FreshGram : functor(Unit : sig end) -> Camlp4Syntax) : Camlp4Syntax =
  FreshGram(struct end)

module B(FreshGram : functor(Unit : sig end) -> Camlp4Syntax) : Camlp4Syntax =
  Printers_Ocaml_Make(A(FreshGram))


This compiles fine, however, when I manually inline functor A:


module C(FreshGram : functor(Unit : sig end) -> Camlp4Syntax) : Camlp4Syntax =
  Printers_Ocaml_Make(FreshGram(struct end))


I get a signature mismatch error in both 3.11.2 and 3.12. I would
appreciate any explanation for this behaviour.

As the names suggest the problem came up with in some Camlp4
code. Here is a striped down version, which reproduces the
problem:

==============================================================================
module type Loc = sig               (* simplified version of Camlp4.Sig.Loc *)
  type t
end

module type Camlp4Ast = sig              (* simplified Camlp4.Sig.Camlp4Ast *)
  module Loc : Loc
end

module type Camlp4Syntax = sig        (* simplified Camlp4.Sig.Camlp4Syntax *)
  module Loc : Loc
  module Ast : Camlp4Ast with module Loc = Loc
end

module type Printers_Ocaml_Make_Sig =      (* .mli of Camlp4/Printers/OCaml *)
  functor(Syntax : Camlp4Syntax) -> 
sig
  include Camlp4Syntax
    with module Loc = Syntax.Loc
    and module Ast = Syntax.Ast
end

module Printers_Ocaml_Make :                (* .ml of Camlp4/Printers/OCaml *)
  Printers_Ocaml_Make_Sig = functor(Syntax : Camlp4Syntax) ->
struct
  include Syntax
end


module A(FreshGram : functor(Unit : sig end) -> Camlp4Syntax) : Camlp4Syntax =
  FreshGram(struct end)

module B(FreshGram : functor(Unit : sig end) -> Camlp4Syntax) : Camlp4Syntax =
  Printers_Ocaml_Make(A(FreshGram))

module C(FreshGram : functor(Unit : sig end) -> Camlp4Syntax) : Camlp4Syntax =
  Printers_Ocaml_Make(FreshGram(struct end))
===============================================================================

The error occurs in the last line and says

Error: Signature mismatch:
       Modules do not match:
         sig
           module Loc : sig type t end
           module Ast : sig module Loc : sig type t end end
         end
       is not included in
         Camlp4Syntax
       Modules do not match:
         sig module Loc : sig type t = Ast.Loc.t end end
       is not included in
         sig module Loc : sig type t = Loc.t end end
       Modules do not match:
         sig type t = Ast.Loc.t end
       is not included in
         sig type t = Loc.t end
       Type declarations do not match:
         type t = Ast.Loc.t
       is not included in
         type t = Loc.t

The error goes away with the following version of Printers_Ocaml_Make_Sig:

module type Printers_Ocaml_Make_Sig = functor(Syntax : Camlp4Syntax) -> 
sig
  module Loc : Loc 
    with type t = Syntax.Loc.t

  module Ast : Camlp4Ast 
    with type Loc.t = Syntax.Ast.Loc.t
    and type Loc.t = Loc.t
end

IMHO both Printers_Ocaml_Make_Sig versions should be equivalent:
in the second version the include is spelled out and the module
constraints are expanded into type constraints. 

The error comes back if one changes the order of the type
constaints for module Ast.


Bye,

Hendrik


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-09-07 20:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-09-06  9:12 functor substitution gives error Hendrik Tews
2010-09-06  9:39 ` [Caml-list] " Daniel Bünzli
2010-09-07 20:46   ` Jacques Garrigue
2010-09-07 10:48 ` Jacques Garrigue
2010-09-07 13:32   ` Hendrik Tews
2010-09-07 13:54   ` Daniel Bünzli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).