caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Brian Rogoff <bpr@artisan.com>
To: caml-list@inria.fr
Cc: skaller@ozemail.com.au
Subject: Re: [Caml-list] sorting Hashtbl.t
Date: Thu, 15 Aug 2002 09:43:34 -0700	[thread overview]
Message-ID: <15707.55862.181324.32529@granite.artisan.com> (raw)
In-Reply-To: <3D5AD6CF.7030603@ozemail.com.au>

John Max Skaller writes:
> > 	From an algorithmic point of view, there is no way to sort an
> > hash table since there is no order attached to items. 
[...snip extended Hashtbl interface ...]
> Of course I can write this
> function myself, it's just inconvenient to have to
> keep doing so.

The only thing that really prevents you from doing this just once in a 
fairly neat and comfortable way is the restriction on multiple definitions
of the same module name in a given structure or signature, in this case, 
Make. Why don't later module names just shadow previous ones, as later
function definitions follow succeeding ones? If this were the case, then we 
could handle this problem with something like so 

(* exthash.mli -- NOT LEGAL OCaml *)
include Hashtbl 

val elements : ('a, 'b) Hashtbl.t -> 'b list

module type S = 
  sig 
    include S 
    val elements : ('a, 'b) Hashtbl.t -> 'b list
  end

module Make (H : HashedType) : S with type key = H.t

(* exthash.ml -- NOT LEGAL OCaml *)
include Hashtbl 

let elements ht = 
  let r = ref [] in 
  (Hashtbl.iter (fun _ y -> r := y::(!r)) ht; !r)  

module type S = 
  sig 
    include S (* S here refers to Hashtbl.S *)
    val elements : ('a, 'b) Hashtbl.t -> 'b list
  end

module Ext (H : HashedType) : S with type key = H.t = 
  struct 
    module Hashtbl =  Make(H)
    include Hashtbl
    let elements ht = 
      let r = ref [] in 
      (Hashtbl.iter (fun _ y -> r := y::(!r)) ht; !r)  
  end

but because of the restrictions we need to replace those includes with a
manual copying of all of the relevant code from the Hashtbl module. 

-- 

  I mean, if 10 years from now, when you are doing something quick and dirty, 
  you suddenly visualize that I am looking over your shoulders and say to 
  yourself, 'Dijkstra would not have liked this,' well that would be enough 
  immortality for me.

  Edsger Wybe Dijkstra 1930-2002

-- Brian
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


  parent reply	other threads:[~2002-08-15 16:43 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-08-12  1:08 Oleg
2002-08-12  9:51 ` Nicolas Cannasse
2002-08-12 13:44   ` Oleg
2002-08-13  7:45     ` Igor I. Harzmann
2002-08-12 10:10 ` Yann Régis-Gianas
2002-08-14 22:16   ` John Max Skaller
2002-08-14 23:13     ` Alexander V.Voinov
2002-08-15 16:43     ` Brian Rogoff [this message]
2002-08-16 17:47 Brian Rogoff

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=15707.55862.181324.32529@granite.artisan.com \
    --to=bpr@artisan.com \
    --cc=caml-list@inria.fr \
    --cc=skaller@ozemail.com.au \
    /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).