From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from weis@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id KAA06165 for caml-redistribution; Thu, 10 Apr 1997 10:52:17 +0200 (MET DST) Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id VAA17772 for ; Fri, 4 Apr 1997 21:02:06 +0200 (MET DST) Received: from simon.cs.cornell.edu (SIMON.CS.CORNELL.EDU [128.84.154.10]) by nez-perce.inria.fr (8.7.6/8.7.3) with ESMTP id VAA23114 for ; Fri, 4 Apr 1997 21:02:05 +0200 (MET DST) Received: from cloyd.cs.cornell.edu (CLOYD.CS.CORNELL.EDU [128.84.227.15]) by simon.cs.cornell.edu (8.8.5/8.8.5/R-1.8) with ESMTP id OAA25501; Fri, 4 Apr 1997 14:02:02 -0500 (EST) Received: from gulag.cs.cornell.edu (GULAG.CS.CORNELL.EDU [128.84.211.142]) by cloyd.cs.cornell.edu (8.8.5/8.8.5/M-1.9) with ESMTP id OAA02897; Fri, 4 Apr 1997 14:02:00 -0500 (EST) Received: from gulag.cs.cornell.edu (localhost [127.0.0.1]) by gulag.cs.cornell.edu (8.7.4/8.7.3/C-1.1) with ESMTP id OAA17096; Fri, 4 Apr 1997 14:03:26 -0500 Message-Id: <199704041903.OAA17096@gulag.cs.cornell.edu> To: Basile STARYNKEVITCH cc: caml-list@inria.fr Subject: Re: Q: hashtables of parametrized types in Ocaml? In-reply-to: Your message of "Fri, 04 Apr 1997 13:44:43 +0200." <199704041144.NAA11665@soleil.serma.cea.fr> Date: Fri, 04 Apr 1997 14:03:26 -0500 From: Mark Hayden Sender: weis 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. >---------------------------------------------------------------------- > > >