在 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
[]
回傳一個空串列,就好像修改從未發生過一樣。為什么會發生這種情況?輸出不應該是一樣的嗎?
uj5u.com熱心網友回復:
當你寫的時候ref = newIORef ...,的型別ref是IO (IORef [Int])(因為那是newIORef回傳的型別)。每次執行該 IO 操作(通過將其包含在 GHCI 評估的 IO 操作中)時,您都會獲得一個新的 IORef。
相反,當您撰寫 時ref <- newIORef,您是在要求 GHCI 執行 IO 操作,產生一個IORef [Int],并將結果 IORef 保存到變數 中ref。然后您對其執行的所有后續操作都在同一個 IORef 上執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/386995.html
