Hi there, I'm having some trouble trying to get information out of a HashTable. I'm using it to represent a set (I'm using a hash table for O(1) speed reasons to compare against Data.Sets O(lgN) operations). I'm trying to write a simple function, member, which returns whether or not a key is in the HashTable. I've tried the following: member :: HashTable String Int -> String -> Bool member hash x = let r = do return (Data.HashTable.lookup hash x ) in case r of Nothing -> False (Just v) -> True But this seems to always return True. I _think_ the type of r here is IO (Maybe Int), but I'm trying to unwrap the IO part. However, if I try: member :: HashTable String Int -> String -> Bool member hash x = let r = do Data.HashTable.lookup hash x in case r of Nothing -> False (Just v) -> True I get the following error: figt.hs:46:31: Couldn't match `IO (Maybe Int)' against `Maybe a' Expected type: IO (Maybe Int) Inferred type: Maybe a When checking the pattern: Nothing In a case alternative: Nothing -> False How can I get at the underlying value? Can I only access it from within a "do" construct? Is there anyway to get at this function to return just True or False? Or has using something that uses an IO monad "polluted" everything else that depends on the answer? H