我正在使用new (==) hashInt
返回类型为IO (HashTable key val)
的值,那么我是否只能在IO monad中进行查找/插入?
如果是这种情况,我怎样才能从HashTable中获取纯数据以用于纯函数?对于前者我有一个函数,它接受HashTable和一个键作为参数,并应返回由该键索引的值...
我真的很难与Hashtables合作,因为我无法从IO monad中获取价值。这甚至可能吗?
答案 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
...