[Haskell-cafe] Types and hashes of hashes, trouble for a Java-programmer...

Dan Doel dan.doel at gmail.com
Mon Apr 13 13:44:02 EDT 2009


On Monday 13 April 2009 11:42:33 am John Smith wrote:
> Hi, a java-programmer running into trouble while trying to learn Haskell.
>
> I try to make a hash containing hashes but can not getting a value out of
> the innermost hash - I keep running into type-trouble where IO and Maybe
> monad is getting mixed?

I don't know the type of all these things, but here's a try.

> My attempt:
>
> removeMaybeHash x =
>   case x of
>   Just ref -> ref
>   Nothing -> HashTable.new (==) (\key -> key)

'HashTable.new ...' has type IO (HashTable k v). This means that the type of 
removeMaybeHash must be:

  Maybe (IO (HashTable k v)) -> IO (HashTable k v)

because in the Just case, you're just using 'ref' as the result of the 
function. This is probably not what you want, so you should use 'return ref'. 
This will make it have type:

  Maybe (HashTable k v) -> IO (HashTable k v)

> test = do
>   h <- HashTable.new (==) (\key -> key)
>   h1 <- HashTable.new (==) (\key -> key)
>   HashTable.insert h 3 h1
>   HashTable.insert h1 1 1000
>   maybeOuterHash <- HashTable.lookup h 3
>   res <- removeMaybe (removeMaybeHash maybeOuterHash) 1000

I don't know what the type of removeMaybe is supposed to be, but as used in 
this expression, with the above note about the type of removeMaybeHash, it 
must have type:

  IO (HashTable k v) -> Int -> IO (something)

which is an odd type for a function with name "removeMaybe".

>   return res
>
> Any clues?

Hopefully those help. As an additional clue, I'd recommend you write some type 
signatures at the top level for what you expect the types of your functions to 
be. That might help point out more specifically where things aren't going as 
you expect.

-- Dan


More information about the Haskell-Cafe mailing list