Haskell 中 IORef 的行为
Behaviour of IORef in Haskell
在 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
returns的类型)。每次执行该 IO 操作(通过将其包含在 GHCI 评估的 IO 操作中)时,您都会获得一个新的 IORef。
相比之下,当您编写 ref <- newIORef
时,您是在要求 GHCI 执行 IO 操作,产生一个 IORef [Int]
,并将生成的 IORef 保存到变量 ref
。然后你对它执行的所有后续操作都在同一个 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
returns的类型)。每次执行该 IO 操作(通过将其包含在 GHCI 评估的 IO 操作中)时,您都会获得一个新的 IORef。
相比之下,当您编写 ref <- newIORef
时,您是在要求 GHCI 执行 IO 操作,产生一个 IORef [Int]
,并将生成的 IORef 保存到变量 ref
。然后你对它执行的所有后续操作都在同一个 IORef 上执行。