I learned a clever hack from Jacques Garrigue: recursive modules allow
you to get a module corresponding to a module type. The "module of S"
is
  module rec X : S = X

Using this trick, one can write in c_sig.ml

  module type S = sig
    ...
  end

the usual thing in .mli, and then

  module Make (B : B) = struct
    module rec S_mod : (Sig.S with type t = B.t) = S_mod
    include S_mod
    let not_much_code = assert false
  end

On Tue, Apr 3, 2012 at 1:23 PM, Dawid Toton <d...@wp.pl> wrote:
> Consider the following:
>
> --- a.mli
> module type B = sig
>  type t
> end
>
> module type S = sig
>  type t
>  type other_lenghty_definitions
>  val not_much_code : t
> end
>
> module Make (B : B) : S
>  with type t = B.t
> ---
> --- a.ml
> module type B = sig
>  type t
> end
>
> module type S = sig
>  type t
>  type other_lenghty_definitions
>  val not_much_code : t
> end
>
> module Make (B : B) = struct
>  type t = B.t
>  type other_lenghty_definitions
>  let not_much_code = assert false
> end
> ---
>
> So we have to keep 3 copies of other_lenghty_definitions. I can have it
> isolated in a separate file and insert into a.ml and a.mli in an extra
> preprocessing step. But I believe there should be some clean solution,
> something like the following:
>
> --- c_sig.ml
> module S = struct
>  type t
>  type other_lenghty_definitions
> end
>
> module type S = sig
>  include (module type of S) (* 1 *)
>  val not_much_code : t
> end
> ---
> --- c.mli
> module type B = sig
>  type t
> end
>
> module Make (B : B) : C_sig.S
>  with type t = B.t
> ---
> --- c.ml
> module type B = sig
>  type t
> end
>
> module Make (B : B) = struct
>  include C_sig.S
>    with type t = B.t (* 2 *)
>
>  let not_much_code = assert false
> end
> ---
>
> How to do what I mark with (* 1 *) and (* 2 *) correctly? Would it help if I
> upgrade my toolchain from 3.11.2 to some more recent version?
> Dawid
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa-roc.inria.fr/wws/info/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>


-- 
Caml-list mailing list.  Subscription management and archives:
https://sympa-roc.inria.fr/wws/info/caml-list
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Reply via email to