- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这段代码到底做了什么? someMap
是 ::Data.Map.Strict.Map
引用的对象 (::Data.Map.Strict.Map
) 的副本,还是仅作为引用?我的意思是,在使用 readIORef
读取后,someMap
可以更改(通过另一个线程)吗?像C的不稳定的东西......可能吗?我希望它是复制/快照,因此任何更改都不会影响我的 someMap
,或者...?
do
....
someMap <- readIORef myMap
....
最佳答案
不,这不是副本。在 Haskell 中,不存在“副本”这样的东西,只有值,并且所有值都是不可变的。
IORef
包含一个值。 IORef
本身是可变的:您可以更改它包含的值。该值本身是不可变的。要理解这一点,请考虑当前包含 5
的 IORef 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/
这对我来说完全是一个惊喜。有人可以解释背后的原因是什么readIORef阻塞,当有 atomicModifyIORef在飞行中?我知道假设是提供给后一个函数的修改函数应该非常快,但这不是重点。 这是一
这段代码到底做了什么? someMap 是 ::Data.Map.Strict.Map 引用的对象 (::Data.Map.Strict.Map) 的副本,还是仅作为引用?我的意思是,在使用 read
如果我在多个线程之间共享一个 IORef,并使用 atomicModifyIORef 写入它: atomicModifyIORef ref (\_ -> (new, ())) 使用普通的旧 readI
我是一名优秀的程序员,十分优秀!