Version française
Home     About     Download     Resources     Contact us    
Browse thread
Re: One more question about the module system
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: pbrisset@e...
Subject: Re: One more question about the module system

...
> (* m1.ml *)
>         module Make(L: MTYPE_L)(Some_M2: MTYPE_M2) = struct
>           open L
>           open Some_M2
>           ...
>         end
> (* m.ml *)
>         module Make(L: MTYPE_L)(Some_M1: MTYPE_M1) = struct
>           open L
>           open Some_M1
>           ...
>         end
> 
> (You will probably need to express sharing constraints between type
> components of the parameters. Express them with "with type" or
> "with module", e.g.
>         module Make(L: MTYPE_L)(Some_M2: MTYPE_M2 with type t = L.t) ...
> )
> 
> Then do all the functor applications in a "main" file:
> 
>         module L = L1 (* or L2 *)
>         module M2 = M2.Make(L)
>         module M1 = M1.Make(L)(M2)
>         module M = M.Make(L)(M1)
> 
> The advantage of this approach is that you can also provide
> "hand-made" M1 or M2 modules (not produced by application of M1.Make
> or M2.Make), so you get more flexibility. The disadvantage is
> increased verbosity and number of declarations needed.
> 
> - Xavier Leroy

 I eventually found the same solution. Because I wanted a single "big"
module, I wrote:

	(* m.ml *)
	module Make(L: SIG_L) = struct
	  module M2 = M2.Make(L)
	  open M2
	  module M1 = M1.Make(L, M2)
	  open M1
	  ...

 I also checked that runtime efficiency is not modified by all these
functorizations.

--Pascal