Pau*_*-AG 2 haskell immutability do-notation io-monad ioref
该代码的作用是什么?是someMap(的::Data.Map.Strict.Map)对象的副本是否由myMap引用或仅作为引用?我的意思是,在我阅读后可以someMap更改(通过另一个线程)readIORef吗?像C的易失性...可能吗?我希望它是复制/快照,因此任何更改都不会影响我someMap或...?
do
....
someMap <- readIORef myMap
....
Run Code Online (Sandbox Code Playgroud)
不,它不是副本。在Haskell中,没有“复制”之类的东西,只有值,并且所有值都是不可变的。
一个IORef包含一个值。在IORef本身是可变的:你可以改变的价值在于它包含的内容。该值本身是不可变的。要了解这一点,请考虑IORef Int当前包含的5。如果您获得该值并添加一个6值,则可以创建一个新值,但尚未更改该5值突然变为6,因为的值5是不变的。
同样,如果我Map使用该值创建一个fromList [("foo", 5), ("bar, 6")]并将其放入IORef中,则IORef现在包含该值,但是该值本身是不可变的。如果我得到该值并使用Map.insert创建的新值(未修改原始值)添加新条目,则与5和6上面的方法完全相同。
希望能回答您的问题。但是,您现在可能会有另一个。如果所有值都是不可变的,则IORefs如何更改?
答案是IORef本身不会改变。但是,IORef可以作为通向不断变化的,我们称为“现实世界”的混乱状态的门户。在“现实世界”中,您可以两次执行相同的操作并获得不同的结果。其中包括readLine和readIORef。存在IO monad可以隔离此混乱情况,同时仍允许程序与其进行交互。因此,与IORefs兼容的每个功能都在IO monad中。