Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Pierre Weis <Pierre.Weis@inria.fr>
To: yann.coscoy@icdc.caissedesdepots.fr (Coscoy, Yann)
Cc: caml-list@inria.fr
Subject: Re: hashtables for mutable records
Date: Thu, 27 Apr 2000 19:56:02 +0200 (MET DST)	[thread overview]
Message-ID: <200004271756.TAA16691@pauillac.inria.fr> (raw)
In-Reply-To: <40C4228EC468D211B04800A0C9DF1D6636DE0C@tsexchange.idt.cdc.fr> from "Coscoy, Yann" at Apr 27, 2000 03:28:41 PM

>     Hello,
> 
> I want to do an hashtable on mutable and polymorphic records. Standard
> module Hashtbl is not suitable because:
>   - Hashtbl.HashType doesn't accept polymorphic types.
>   - Hashtbl.hash is susceptible to setups of a mutable fields.
> 
> I would appreciate any suggestion.
> 
>   Cheers,
> 
>        Yann Coscoy

You can use a unique integer field into your records to get a suitable
hash key (not sensible to mutation of your records). Of course you
must use your own hashing function that just reads this fixed integer
field.

As of polymorphism, if your problem is just to have keys or values
belonging to a parameterized data type, you can directly use the
creation and manipulation functions from the Hashtbl module
(Hashtbl.create, Hashtbl.add, etc): they accept to manipulate
polymorphic tables. Since usage of these functions with a user defined
hash function is not available from the Hashtbl module, you should
rewrite some parts of its code into your own hash table module.

If your polymorphism problem is deeper, namely you want to create a
polymorphic hash table, there is not very much to do for you, since
hash tables being mutable structures, type constraints must be
cumulative: for example, if you define tab as an (int, 'a list)
Hashtbl.t then adding a string list into tab will constraint the type
of tab to be (int, string list) Hashtbl.t; hence, after adding a
string list into tab, you are forced to add string list into it and
you cannot add an int list into it. This is simple to explain: if
there are objects of various (uncompatible) types into the table, how
can we guess the type of something we get from the table ?

Note that you can define a concrete sum type to solve this problem, if
the types of objects you want to store in the table are statically
known; for instance for int list and bool list you can define:

type storable =
   | IL of int list
   | SL of string list

and then use an (int, storable) Hashtbl.t.
Admitedly, this trick is inefficient if you really need polymorphism,
but in some cases it is really useful.

Hope your problem is the simple one!

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://cristal.inria.fr/~weis/





  reply	other threads:[~2000-04-27 17:59 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-04-27 13:28 Coscoy, Yann
2000-04-27 17:56 ` Pierre Weis [this message]
2000-04-28  1:12 ` Jacques Garrigue
2000-04-28  8:14 Coscoy, Yann

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=200004271756.TAA16691@pauillac.inria.fr \
    --to=pierre.weis@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=yann.coscoy@icdc.caissedesdepots.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