How about this: --- a.mli --- type map val fold : (string -> int -> 'a -> 'a) -> map -> 'a -> 'a val iter : (string -> int -> unit) -> map -> unit --- a.ml --- module M = Map.Make(String) type map = int M.t include M You avoid boilerplate in the implementation, but I don't know how to avoid writing out the restricted types in the signature. On Mon, Sep 20, 2010 at 3:02 PM, Dumitru Potop-Butucaru < dumitru.potop_butucaru@inria.fr> wrote: > > Yes, but this involves duplicating code, and I really hate to duplicate > code, even in interfaces. > > To also answer Ashish: I want to define an interface to modules where I use > a very specific kind of map. Of course, I could leave Map.Make polymorphic, > but that is a different module type than the one I want to use to represent > my theory. > > Yours, > Jacky > > > > On 20/09/2010 19:58, Martin Jambon wrote: > >> Dumitru Potop-Butucaru wrote: >> >>> Actually, I was looking for a way to specialize a whole module, >>> not just the associated type (**this** I knew how to do). >>> I would like to write something like: >>> >>> include module type of Set.Make(String) with 'a= int >>> >>> Is this possible? >>> >> I don't know about such a shortcut, but the following works and the >> interface >> is easier to use for a human: >> >> (* foo.mli *) >> type key = string >> type value = string >> type map >> val empty : map >> val is_empty : map -> bool >> val add : key -> value -> map -> map >> val find : key -> map -> value >> val remove : key -> map -> map >> val mem : key -> map -> bool >> val iter : (key -> value -> unit) -> map -> unit >> val map : (value -> value) -> map -> map >> val mapi : (key -> value -> value) -> map -> map >> val fold : (key -> value -> 'a -> 'a) -> map -> 'a -> 'a >> val compare : (value -> value -> int) -> map -> map -> int >> val equal : (value -> value -> bool) -> map -> map -> bool >> >> >> (* foo.ml *) >> module M = Map.Make (String) >> include M >> type value = string >> type map = string M.t >> >> >> >> Martin >> >> >> Yours, >>> Jacky Potop >>> >>> >>> >>> >>> On 20/09/2010 16:57, Ashish Agarwal wrote: >>> >>>> module M = Map.Make(String) >>>> >>>> type t = int M.t >>>> >>>> Type t is the type of maps from string's to int's. Or alternatively >>>> write a >>>> function that assumes 'a is some specific type: >>>> >>>> # let f m = M.fold (fun _ x y -> x + y) m 0;; >>>> val f : int M.t -> int = >>>> >>>> >>>> On Mon, Sep 20, 2010 at 10:35 AM, Dumitru Potop-Butucaru< >>>> dumitru.potop_butucaru@inria.fr> wrote: >>>> >>>> Hello, >>>>> >>>>> I'm certain most users here will consider the question trivially >>>>> simple, >>>>> but I browsed the documentation without finding a solution. >>>>> >>>>> The question is quite general: Given a polymorphic definition like >>>>> Map.Make(X), where >>>>> X is some module, how can I specialize its 'a type parameter, e.g. by >>>>> setting it to Y, so that >>>>> I have maps from X to Y ? >>>>> >>>>> Yours, >>>>> Jacky Potop >>>>> >>>>> _______________________________________________ >>>>> Caml-list mailing list. Subscription management: >>>>> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list >>>>> Archives: http://caml.inria.fr >>>>> 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: >>> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list >>> Archives: http://caml.inria.fr >>> 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: > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > Archives: http://caml.inria.fr > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs > >