Re: why do i have to repeat so much here?
| Newsgroups | gmane.comp.lang.ocaml.beginners |
|---|---|
| Message-ID | <CAFrFfuGsujkOG5eQk4KAdjWJ02Y=6fGWMVFKDiXSEi7FgkABOQ@mail.gmail.com> |
interesting thread. i usually don't mind repeating myself in the .mli file - i think what is annoying me the most here is that i don't really have an "implementation"; all i want to do is define a single record type with a type parameter. i know i could delete the .mli file and have everything work, but that feels wrong when theoretically i want to delete the .ml file instead. thanks for the pointer to ppx_import - at some point i'll probably get annoyed enough to use it :) though as you advise, i'll maintain the current code for a while first, and see how painful it is to add fields to the record in three places every time. martin On Mon, Aug 18, 2014 at 10:54 PM, Gabriel Scherer [email protected] [ocaml_beginners] <[email protected]> wrote: > > > You may be interested in this long caml-list thread about precisely this > question: > https://sympa.inria.fr/sympa/arc/caml-list/2012-10/msg00205.html > The short answer is "there is no well-understood way to do better without > design hacks". > > Some people have designed meta-programming tools to macro-away some of the > boilerplate (eg. recently https://github.com/whitequark/ppx_import ). I > would recommend first trying to do it the usual way, to get a feeling of > how sufferable it actually is. > > > On Tue, Aug 19, 2014 at 7:50 AM, Martin DeMello [email protected] > [ocaml_beginners] <[email protected]> wrote: > >> >> >> I'm learning my way around the module system, and trying to write a small >> Environment module that creates a record based on a given type. My code >> works, but it looks like i had to essentially write out the record >> definition thrice. Is there a better way to do this? >> >> Here's the definition of the module >> >> /-------------------------------- >> $ cat environment.mli >> >> module type ENV = sig >> type dict >> >> type env = { >> dict : dict; >> op : Types.uop >> } >> end >> >> module Make (Dict : sig type t end) : ENV with type dict = Dict.t >> >> $ cat environment.ml >> >> module type ENV = sig >> type dict >> >> type env = { >> dict : dict; >> op : Types.uop >> } >> end >> >> module Make (Dict : sig type t end) = struct >> type dict = Dict.t >> >> type env = { >> dict : dict; >> op : Types.uop >> } >> end >> >> \-------------------------------- >> >> and I'm using it in the following code: >> >> /-------------------------------- >> module Evaluator = >> functor (Env : ENV) -> >> functor (E : ENGINE with type dict = Env.dict) -> >> struct ... end >> >> module Env = Environment.Make (Trie) >> >> module Eval = Evaluator.Evaluator (Env) (TrieEngine) >> \-------------------------------- >> >> martin >> >> >> >> > >