在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
[]返回一个空列表,好像修改从未发生过一样。这一切为什么要发生?输出不应该一样吗?
发布于 2021-12-17 10:48:00
编写ref = newIORef ...时,ref的类型是IO (IORef [Int]) (因为这是newIORef返回的类型)。每次执行该IO操作时(通过将其包含在GHCI计算的IO操作中),您将得到一个新的IORef。
相反,在编写ref <- newIORef时,您要求GHCI执行IO操作,生成一个IORef [Int],并将结果IORef保存到变量ref中。然后,您对其执行的所有后续操作都在同一个IORef上执行。
https://stackoverflow.com/questions/70391196
复制相似问题