Version française
Home     About     Download     Resources     Contact us    
Browse thread
How can I set a type parameter of Map.Make(X) ?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Martin Jambon <martin.jambon@e...>
Subject: code duplication (was Re: [Caml-list] How can I set a type parameter of Map.Make(X) ?)
Dumitru Potop-Butucaru wrote:
> 
> Yes, but this involves duplicating code, and I really hate to duplicate
> code, even in interfaces.

We could also argue that writing interfaces in general is code duplication.

Duplicating source code or data is bad only if future bugs and enhancements
are not guaranteed to be applied to all the copies.  It's not the case here
because if the Map module of the standard library ever changes in an
incompatible way, your .ml will no longer be compatible with your .mli and the
compiler will not let this pass.

Duplicating the comments of the standard map.mli may however not such a good
idea because as always the compiler ignores them.  Adding something like (*
See the documentation of the standard Map module *) seems reasonable to me.


Martin

> 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


-- 
http://mjambon.com/