在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上执行。