理解`modifyMVar_`

时间:2017-10-28 19:04:41

标签: haskell

假设:

λ: >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"

我做错了什么?

1 个答案:

答案 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"