Haskell,从哈希表中获取值

时间:2011-10-30 00:25:32

标签: haskell ghc

我正在使用new (==) hashInt返回类型为IO (HashTable key val)的值,那么我是否只能在IO monad中进行查找/插入?

如果是这种情况,我怎样才能从HashTable中获取纯数据以用于纯函数?对于前者我有一个函数,它接受HashTable和一个键作为参数,并应返回由该键索引的值...

我真的很难与Hashtables合作,因为我无法从IO monad中获取价值。这甚至可能吗?

2 个答案:

答案 0 :(得分:3)

  

我是否只能在IO monad中进行查找/插入?

  

我真的很难与Hashtables合作,因为我做不到   从IO monad中获取值。这甚至可能吗?

没有

纯值是不可变的。与大多数哈希表一样,此Hashtable是可变容器。这意味着您的程序只能通过小心所有命令的执行顺序来使用Hashtable。要在控制执行顺序时有用,Haskell语言会为编写代码提供IO(或ST)monad和语法糖(“do”表示法)。

读取和写入Hashtable都是执行命令,并且不使用纯值“let”绑定语法。因此,从HashTable中读取通常会被视为在“do”表示法中使用“< - ”,就像在vivian的例子中一样。

注意:使用Data.Map.Map将允许您拥有允许插入和查找但纯粹的内容。

答案 1 :(得分:2)

IO monad的目的是处理副作用。如果您在IO内使用数据,则需要在IO monad中调用纯函数。

您需要在IO monad中调用纯函数。

doSomethingWithHashTable :: HashTable key val -> key -> Maybe val
-- this is the pure function that you sequence within the `IO` monad

main :: IO ()
main = do
    ...
    hashtable <- new (==) hashInt
    hashtable' <- return $ doSomethingWithHashtable hashtable
    ...

编辑正如评论中所指出的,所有hashtable函数都是不纯的。

doSomethingWithHashTable :: HashTable key val -> IO Bool
doSomethingwithHashtable ht = do
    insert ht 1
    r <- lookup ht 1
    case r of
       Just _   -> return True
       NOhting  -> return False

main = do
    ...
    hashtable <- new (==) hashInt
    result <- doSomethingWithHashTable hashtable
    ...