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 =<fun>


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