Haskell 中 IORef 的行为

Luk*_*kas 4 haskell ioref

在 GHCI(版本 9.0.1)中,以下内容返回了我所期望的内容:

ghci> import Data.IORef
ghci> ref <- newIORef ([] :: [Int])
ghci> modifyIORef ref (1:)
ghci> readIORef ref
[1]
Run Code Online (Sandbox Code Playgroud)

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

ghci> import Data.IORef
ghci> ref = newIORef ([] :: [Int])
ghci> ref >>= \r -> modifyIORef r (1:) 
ghci> ref >>= readIORef
[]
Run Code Online (Sandbox Code Playgroud)

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

ama*_*loy 9

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

相反,当您编写 时ref <- newIORef,您要求 GHCI 执行 IO 操作,产生一个IORef [Int],并将生成的 IORef 保存到变量 中ref。那么后面你对它执行的所有操作都是在同一个IORef上执行的。