[Haskell-cafe] Simple hash table creation

Daniel Fischer daniel.is.fischer at web.de
Tue Nov 17 14:36:46 EST 2009


Am Dienstag 17 November 2009 20:16:50 schrieb michael rice:
> I'm trying to create a hash table. Yeah, I know, don't use hash tables, but
> I need to create something I'm familiar with, not something I've never
> worked with before. What's wrong with this code?
>
> Michael
>
> ====================
>
> import Prelude hiding (lookup)
> import Data.HashTable
>
> data MyHashTable = HashTable String Int
>
> dummy:: String -> Int
> dummy s = 7
>
> ht = MyHashTable.new (==) dummy
>
> ====================

 MyHashTable.new is parsed as a qualified function, 'new' from the module MyHashTable. But 
there's no module MyHashTable imported, hence there's no function 'new' from that module 
in scope.

>
> [michael at localhost ~]$ ghci hash1
> GHCi, version 6.10.3: http://www.haskell.org/ghc/  :? for help
> Loading package ghc-prim ... linking ... done.
> Loading package integer ... linking ... done.
> Loading package base ... linking ... done.
> [1 of 1] Compiling Main             ( hash1.hs, interpreted )
>
> hash1.hs:9:5: Not in scope: `MyHashTable.new'
> Failed, modules loaded: none.
> Prelude>

If we look at the type of Data.HashTable.new:

new ::  (key -> key -> Bool)  -> (key -> GHC.Int.Int32)  -> IO (HashTable key val)

we see that

new (==) dummy

(or Data.HashTable.new (==) dummy, but we don't need to qualify new)
has type

IO (HashTable String val), so is an IO-action returning a hashtable.

What you probably wanted was

type MyHashTable = HashTable String Int -- not data MyHashTable

ht <- new (==) dummy :: IO MyHashTable

then ht is a hashtable of type MyHashTable.


More information about the Haskell-Cafe mailing list