【发布时间】:2021-12-17 09:44:10
【问题描述】:
在 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
[]
返回一个空列表,就好像修改从未发生过一样。为什么会这样?输出不应该一样吗?
【问题讨论】:
-
您可能还会发现这些启发式的脱糖。第一个是
m >>= (\x -> f x >> g x);后者是(m >>= (\x -> f x)) >> (m >>= (\x -> g x))。注意m出现一次,每个x在第一个出现两次,但m出现两次,每个x在第二个出现一次。我认为您的演示文稿令人困惑的部分原因在于,在您的第一个示例中,您的ref对应于x,但在您的第二个示例中,您的ref对应于m,因此您为两个选择了相同的名称不同的东西。 -
该问题与stackoverflow.com/questions/28624408/… 密切相关 请记住
ref = newIORef []意味着您始终可以将ref替换为newIORef [],因此最后几行的行为等同于newIORef [] >>= ...。