caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Martin Jambon <martin.jambon@ens-lyon.org>
To: Dumitru Potop-Butucaru <dumitru.potop_butucaru@inria.fr>
Cc: caml-list@inria.fr
Subject: code duplication (was Re: [Caml-list] How can I set a type parameter of Map.Make(X) ?)
Date: Mon, 20 Sep 2010 12:35:39 -0700	[thread overview]
Message-ID: <4C97B78B.5020108@ens-lyon.org> (raw)
In-Reply-To: <4C97AFE2.9000809@inria.fr>

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/


  parent reply	other threads:[~2010-09-20 19:36 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-20 14:35 How can I set a type parameter of Map.Make(X) ? Dumitru Potop-Butucaru
2010-09-20 14:57 ` [Caml-list] " Ashish Agarwal
2010-09-20 17:25   ` Dumitru Potop-Butucaru
2010-09-20 17:31     ` Ashish Agarwal
2010-09-20 17:58     ` Martin Jambon
2010-09-20 19:02       ` Dumitru Potop-Butucaru
2010-09-20 19:32         ` Ashish Agarwal
2010-09-20 19:35         ` Martin Jambon [this message]
2010-09-20 14:59 ` Sylvain Le Gall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4C97B78B.5020108@ens-lyon.org \
    --to=martin.jambon@ens-lyon.org \
    --cc=caml-list@inria.fr \
    --cc=dumitru.potop_butucaru@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).