假设:
λ: >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"
我做错了什么?
答案 0 :(得分:8)
m
每次调用时都会MVar
创建"foo"
。您正在修改一个MVar
,然后创建一个新的并检查它。这与Setting off a interval on application launch in a Haskell Servant app中出现的问题相同,但有一个问题IORef
。
myVar <- m
modifyMVar_ myVar (\_ -> return "bar")
readMVar myVar
这应该按预期为您提供"bar"
。