gpt4 book ai didi

haskell - readIORef 如何工作 : creates copy or it does not?

转载 作者:行者123 更新时间:2023-12-02 06:41:41 25 4
gpt4 key购买 nike

这段代码到底做了什么? someMap::Data.Map.Strict.Map 引用的对象 (::Data.Map.Strict.Map) 的副本,还是仅作为引用?我的意思是,在使用 readIORef 读取后,someMap 可以更改(通过另一个线程)吗?像C的不稳定的东西......可能吗?我希望它是复制/快照,因此任何更改都不会影响我的 someMap,或者...?

     do
....
someMap <- readIORef myMap
....

最佳答案

不,这不是副本。在 Haskell 中,不存在“副本”这样的东西,只有值,并且所有值都是不可变的。

IORef 包含一个值。 IORef 本身是可变的:您可以更改它包含的值。该值本身是不可变的。要理解这一点,请考虑当前包含 5IORef Int。如果您取出该值并将其加一以获得 6,您就创建了一个新值,但您并没有将 5 值更改为突然变为 6,因为 5 的值是不可变的。

同样,如果我创建一个值为 fromList [("foo", 5), ("bar, 6")]Map 并将其放入 IORef 中,IORef 现在包含该值,但该值本身是不可变的。如果我取出该值并使用 Map.insert 添加一个新条目,我就创建了一个新值,而不是修改原始值,与 5 的方式完全相同和上面的 6

希望这能回答您的问题。不过,您现在可能拥有另一份。如果所有值都是不可变的,IORefs 如何改变?

答案是 IORef 本身不会改变。然而,IORefs 的存在是作为一种门户,通向我们称之为“真实世界”的可变的、不断变化的困惑。在现实世界中,你可以做同一件事两次并得到不同的结果。其中包括 readLine 和 readIORef。 IO monad 的存在就是为了隔离这种困惑,同时仍然允许程序与其交互。因此,每个与 IORefs 一起使用的函数都在 IO monad 中。

关于haskell - readIORef 如何工作 : creates copy or it does not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57489844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com