给定:
λ: >let m = newMVar "foo"
λ: >m >>= readMVar
"foo"
我尝试使用modifyMVar_
:
λ: >:t modifyMVar_
modifyMVar_ :: MVar a -> (a -> IO a) -> IO ()
通过:
λ: >m >>= \mvar -> modifyMVar_ mvar (\_ -> return "bar")
但是,它看起来并没有将 m
从 "foo"
修改为 "bar"
。
λ: >m >>= readMVar
"foo"
我做错了什么?
最佳答案
m
每次调用时都会使用 "foo"
创建新的 MVar
。您正在修改一个 MVar
,然后创建一个新的并进行检查。这与此处看到的问题相同Setting off a interval on application launch in a Haskell Servant app异常(exception)的是它是一个 IORef
。
myVar <- m
modifyMVar_ myVar (\_ -> return "bar")
readMVar myVar
这应该会按预期为您提供 "bar"
。
关于haskell - 了解 `modifyMVar_`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46993405/