Haskell中IORef的行为



在GHCI(版本9.0.1(中,以下给出了我所期望的:

ghci> import Data.IORef
ghci> ref <- newIORef ([] :: [Int])
ghci> modifyIORef ref (1:)
ghci> readIORef ref
[1]

但当我用这种方式尝试同样的事情时:

ghci> import Data.IORef
ghci> ref = newIORef ([] :: [Int])
ghci> ref >>= r -> modifyIORef r (1:) 
ghci> ref >>= readIORef
[]

返回一个空列表,就好像从未进行过修改一样。为什么会发生这种情况?输出不应该是一样的吗?

在编写ref = newIORef ...时,ref的类型为IO (IORef [Int])(因为这是newIORef返回的类型(。每次执行该IO操作(通过将其包含在GHCI评估的IO操作中(时,都会得到一个新的IORef。

相反,当您编写ref <- newIORef时,您要求GHCI执行IO操作,生成IORef [Int],并将生成的IORef保存到变量ref。然后,您对其执行的所有后续操作都在同一IORef上执行。

相关内容

  • 没有找到相关文章

最新更新