Version française
Home     About     Download     Resources     Contact us    
Browse thread
Q: hashtables of parametrized types in Ocaml?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Mark Hayden <hayden@c...>
Subject: Re: Q: hashtables of parametrized types in Ocaml?

Here is a similar example that works for me.
This is for hash tables that use MD5 digest 
strings for keys.

--Mark


.mli:

  module MD5_handler : ( Handler.S with type key = Digest.t )

.ml:

  module MD5_key =
    struct
      type t = Digest.t
      let equal = (=)
      let hash s = abs (Hsys.pop_int s 0)
    end

  module MD5_hashtbl = Hashtbl.Make ( MD5_key )

pop_int is a function thats reads an integer in a string:

  val pop_int : string -> int -> int


>
>Hello
>
>[[English]]
>
>Suppose I have
>
>    (* a symbol has a name and a value; value type is unspecified
>       here; in practice it will be defined in another module! *)
>    type 'a asymbol_t = { sy_name: string; sy_val: 'a }
>
>    (* the hash of a symbol is the hash of its name *)
>    let symhash { sy_name= name } = Hash.hash name;
>
>Now I would like to define hashtable of symbol thru the Hashtbl.Make
>functor.
>
>I tried 
>
>    module SymbolHashtbl =
>      Hashtbl.Make(struct
>	type t = 'a asymbol_t
>	let equal = (==)
>	let hash = symhash
>      end)
>
>but it doesn't work! How can I achieve an equivalent result? Of course
>I would like the resulting symbol hashtable module to have a key type
>parametrized by 'a (symbols' value type) and a table type parametrized
>by 'a (the same symbols' value type) and by 'b (the arbitrary hash
>value type - noted 'a on section 16.10 page 186 of refman1.05)
>
>The reason of all this is that I have in my application (some kind of
>translator, building and working on program abstract syntax trees)
>symbols and tree nodes - each node has a symbol and may have
>subnodes. A symbol may have as value a tree node.  So I have a module
>Symbol (defining type 'a asymbol_t) and another module Abstree (for
>abstract syntax trees) defining type node_t and symbol_t = node_t
>asymbol_t.
>
>Perhaps a double functor is the answer, but I can't figure it out!
>
>[[French summary]]
>
>Comment créer une table de hash (via Hashtbl) de types parametrés. Mon
>type asymbol_t (defini ci-dessus) est parametré par le type 'a des
>valeurs de symbole (instantié dans un autre module). Mais le hashage
>ne porte que sur le nom du symbole. Comment faire une table de hash
>sur ces symboles.  
>
>
>N.B. Any opinions expressed here are solely mine, and not of my organization.
>N.B. Les opinions exprimees ici me sont personnelles et n engagent pas le CEA.
>
>
>----------------------------------------------------------------------
>Basile STARYNKEVITCH   ----  Commissariat à l Energie Atomique 
>DRN/DMT/SERMA * CEA/Saclay bat.470 * 91191 GIF/YVETTE CEDEX * France
>fax: (33) 01,69.08.85.68; phone: 01,69.08.40.66; home: 01,46.65.45.53
>email: Basile . Starynkevitch @ cea . fr  (but remove white space)
>I speak french, english, russian. Je parle français, anglais, russe.
>----------------------------------------------------------------------
>
>
>