Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell,从哈希表中获取值_Haskell_Ghc - Fatal编程技术网

Haskell,从哈希表中获取值

Haskell,从哈希表中获取值,haskell,ghc,Haskell,Ghc,我使用的是new(=)hashInt,它返回类型为IO(HashTable key val)的值,所以我只能在IO monad内部进行查找/插入吗 如果是这种情况,如何从哈希表中获取纯数据以用于纯函数?例如,我有一个函数,它将哈希表和键作为参数,并应返回该键索引的值 我在处理哈希表时真的遇到了麻烦,因为我无法从IO monad中获取值。这可能吗?单子的目的是处理副作用。如果使用的是数据“内部”IO,则需要在IOmonad中调用纯函数 您需要在IOmonad中调用纯函数 doSomethingWi

我使用的是
new(=)hashInt
,它返回类型为
IO(HashTable key val)
的值,所以我只能在IO monad内部进行查找/插入吗

如果是这种情况,如何从哈希表中获取纯数据以用于纯函数?例如,我有一个函数,它将哈希表和键作为参数,并应返回该键索引的值


我在处理哈希表时真的遇到了麻烦,因为我无法从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
    ...

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
    ...
是不是我只能在IO monad内部进行查找/插入

我真的在用哈希表工作时磕磕绊绊,因为我不能 从IO monad中获取值。这可能吗

没有

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

读取和写入哈希表都是执行命令,不使用纯值“let”绑定语法。因此,从哈希表中读取通常会被视为使用“ 是不是我只能在IO monad内部进行查找/插入

我真的在用哈希表工作时磕磕绊绊,因为我不能 从IO monad中获取值。这可能吗

没有

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


读取和写入哈希表都是执行命令,不使用纯值“let”绑定语法。因此,从哈希表读取通常会被视为使用“从
IO
中获取哈希表”很容易<代码>新建(=)hashInt>=\hashtable->给你。当然,如果不返回到
IO
,您实际上无法做任何事情。但这有很好的理由。哈希表是不纯的数据结构。您不想要
IO
?嗯,不要使用不纯净的数据结构。这里有
Data.Map
。真正的问题是:有
ST
接口吗?谢谢你,德尔南,你的评论让我更好地理解了:)从
IO
中获取哈希表很容易<代码>新建(=)hashInt>=\hashtable->给你。当然,如果不返回到
IO
,您实际上无法做任何事情。但这有很好的理由。哈希表是不纯的数据结构。您不想要
IO
?嗯,不要使用不纯净的数据结构。这里有
Data.Map
。真正的问题是:是否有
ST
界面?谢谢你,德尔南,你的评论让我更好地理解了:)还有什么理由要使用,你能举一个
doSomethingWithHashTable
的例子吗?从文档中可以看出,
Hashtable
上的所有操作都有
IO
结果。您的答案的总体思路(从monad中取出内容,对其执行纯操作,然后将其放回monad中),但由于这个问题是专门关于
哈希表的
…查看接口,您是对的。特别是对于哈希表,所有的操作都是不纯的。@delnan。您是正确的,所有的
哈希表
函数都是不纯净的@missingno,no reason,只是觉得它可以演示纯函数是如何集成的。有什么理由要同时使用,你能给出一个
doSomethingWithHashTable
的例子吗?从文档中可以看出,
Hashtable
上的所有操作都有
IO
结果。您的答案的总体思路(从monad中取出内容,对其执行纯操作,然后将其放回monad中),但由于这个问题是专门关于
哈希表的
…查看接口,您是对的。特别是对于哈希表,所有的操作都是不纯的。@delnan。您是正确的,所有的
哈希表
函数都是不纯净的@没有,没有理由,只是认为这将演示纯函数是如何集成的。感谢您的精彩解释:)谢谢您的精彩解释:)