Oops, I didn't do a group-reply... so in case anyone is interested in what I ended up with: ---------- Forwarded message ---------- From: Anthony Tavener Date: Wed, Nov 2, 2011 at 2:50 PM Subject: Re: [Caml-list] Nested module exposing type from parent? To: Vincent Aravantinos Actually, better than I initially thought... I keep this as I have them defined already, except as you said: include instead of open. module Vec = struct module Type = struct type t = { x: int; y: int } end include Type let make x y = {x;y} let add a b = {x=a.x+b.x; y=a.y+b.y} end Before, I had instead of the include: type t = Type.t open Type Which worked, but then the type used everywhere was Vec.Type.t Thanks again! Simple and effective, and I was looking in all the wrong places. :) On Wed, Nov 2, 2011 at 2:36 PM, Anthony Tavener wrote: > Thank-you Vincent! > > Though this requires a home for the "source type" module, at least the > types come out right in the end. Thanks! > > And this led me to read specifically about include to understand what it > really does. :) > > > On Wed, Nov 2, 2011 at 2:19 PM, Vincent Aravantinos < > vincent.aravantinos@gmail.com> wrote: > >> ** >> Using "include" instead of "open" would work, ie. turning your example >> into: >> >> module Vec_main = struct >> >> type t = { x: int; y: int } >> let make x y = {x;y} >> let add a b = {x=a.x+b.x; y=a.y+b.y} >> end >> >> module Vec = struct >> include Vec_main >> module Type = struct >> include Vec_main >> ... >> end >> end >> >> Then: >> # let n = Vec.make 2 5;; >> val n : Vec.t = {Vec.x = 2; Vec.y = 5} >> # open Vec.Type;; >> # let m = {x=1;y=2};; >> val m : Vec.Type.t = {x = 1; y = 2} >> # Vec.add m n;; >> - : Vec.t = {Vec.x = 3; Vec.y = 7} >> >> Cheers >> >> -- >> Vincent Aravantinos - Postdoctoral Fellow, Concordia University, Hardware Verification Group >> >> >> On 11/02/2011 03:41 PM, Anthony Tavener wrote: >> >> I've been struggling with this occasionally... >> >> I'm using nested modules to "open" access to select features of a >> module. My problem is I can't find a way to *expose* types in the parent >> module through such nested modules. >> >> A simplified example of what I'm looking at: >> >> module Vec = struct >> >> type t = { x: int; y: int } >> let make x y = {x;y} >> let add a b = {x=a.x+b.x; y=a.y+b.y} >> >> module Type = >> (* something which has type t = Vec.t, >> * with exposed structure when "open"ed. >> * Also note that Vec is not really an >> * explicit module like this; instead it >> * is implemented in vec.ml *) >> end >> >> Example usage... >> >> let n = Vec.make 2 5 >> open Vec.Type >> let m = {x=1;y=2} >> Vec.add m n >> >> >> To date, I've defined the type in the Type submodule, which is then >> used by the parent module. The unsatisfactory quality of this is that >> Vec.Type.t is the "true" type. Ideally the concrete type would live at >> Vec.t, with "open Vec.Type" bringing the fields of the type into scope. >> >> As background, here are examples of opening different features of the >> Vec module: >> >> let c = Vec.add a b >> >> open Vec.Prefixed >> let c = vadd a b >> >> open Vec.Ops >> let c = a +| b >> >> open Vec.Type >> let c = Vec.add a {x;y;z=0.} >> >> Apologies if this is really beginner-list material. It's minor, but has >> been bugging me. >> Thank-you for looking, >> >> Tony >> >> >> >