caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: John Carr <jfc@MIT.EDU>
To: John Whitington <john@coherentgraphics.co.uk>
Cc: "caml-list@inria.fr" <caml-list@inria.fr>
Subject: Re: [Caml-list] Wrapping up the Set module in another
Date: Wed, 26 Mar 2014 13:04:30 -0400	[thread overview]
Message-ID: <201403261704.s2QH4U1f010834@outgoing.mit.edu> (raw)
In-Reply-To: <5332F937.1030303@coherentgraphics.co.uk>


I think your distinction between types of polymorphism is correct.
Set.S contains monomorphic functions.  You want [forall] but Set.Make
gives you [exists].

The library needs a different Set.OrderedType module for every type to
be stored in a Set.S.t.  You only create one such module per call to
make_setset.


> Hi,
> 
> Suppose I want to benchmark various toy set implementations, so I have
> already written:
> 
> module type SetType =
>   sig
>     type 'a t
>     val set_of_list : 'a list -> 'a t
>     val list_of_set : 'a t -> 'a list
>     val insert : 'a -> 'a t -> 'a t
>     val size : 'a t -> int
>     val member : 'a -> 'a t -> bool
>   end
> 
> and then, for example:
> 
> module SetList : sig include SetType end =
>   struct
>     type 'a t = 'a list
> 
>     let list_of_set x = x
> 
>     let rec set_of_list l =
>       match l with
>         [] -> []
>       | h::t ->
>           if List.mem h t then set_of_list t else h :: set_of_list t
> 
>     let insert x l = x :: l
> 
>     let size = List.length
> 
>     let member = List.mem
>   end
> 
> This works fine -- I can put them into a little list, and run tests:
> 
> let implementations =
>   [("Lists", (module SetList : SetType));
>    ("Trees", (module SetTree : SetType));
>    ("Red-black trees", (module SetRedBlack : SetType));
>    ("Hash tables", (module SetHashtbl : SetType))]
> 
> Now, it would be nice to include OCaml's Set module, but can it be
> made to fit the signature? So far I have:
> 
> let make_setset (type s) () =
>   let module SetSet : sig include SetType end =
>     struct
>       module S = Set.Make (struct type t = s let compare = compare end)
> 
>       type 'a t = S.t
> 
>       let list_of_set s = S.elements s
> 
>       let set_of_list l = List.fold_right S.add l S.empty
> 
>       let member = S.mem
> 
>       let insert = S.add
> 
>       let size = S.cardinal
>     end
>   in
>     (module SetSet : SetType)
> 
> and
> 
> let implementations =
>   let module SetSet = (val (make_setset ())) in
>     [("Lists", (module SetList : SetType));
>      ("Trees", (module SetTree : SetType));
>      ("Red-black trees", (module SetRedBlack : SetType));
>      ("Hash tables", (module SetHashtbl : SetType));
>      ("OCaml sets", (module SetSet : SetType))]
> 
> The problem here, it seems to me, is that the connection between 'a in
> make_setset and (type s) and S.elt is not established, and so the
> return types of list_of_set etc. don't type-check.
> 
> Is there any way to do this, or is the functorised implementation of
> Set fundamentally opposed to the normal polymorphism of the type 'a t
> in SetType?
> 
> Thanks,
> 
> -- 
> John Whitington
> Director, Coherent Graphics Ltd
> http://www.coherentpdf.com/
> 
> 
> -- 
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs

  reply	other threads:[~2014-03-26 17:04 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-26 15:58 John Whitington
2014-03-26 17:04 ` John Carr [this message]
2014-03-26 21:11 ` Leo White
2014-03-28  8:22   ` Thomas Braibant
2014-04-03 14:28     ` Leo White
2014-04-03 20:31       ` [Caml-list] More efficient compilation of functors? (was: Wrapping up the Set module in another) Alain Frisch

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=201403261704.s2QH4U1f010834@outgoing.mit.edu \
    --to=jfc@mit.edu \
    --cc=caml-list@inria.fr \
    --cc=john@coherentgraphics.co.uk \
    /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).