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_butuc...@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_butuc...@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
>
>
_______________________________________________
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

Reply via email to