2017-10-28 37 views
2

考虑:了解`modifyMVar_`

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

难道你不应该把它全部写在一行吗? 'm >> = \ mvar - > modifyMVar_ mvar(\ _ - > return“bar”)>> readMVar'? –

+2

我建议你阅读['let' vs'<-'](https://stackoverflow.com/questions/28624408/equal-vs-left-arrow-symbols-in-haskell)。上面你用'let'来表示'<--',我想。 – chi

+0

[在Haskell Servant应用程序中启动应用程序时启动间隔]的可能重复(https://stackoverflow.com/questions/46959753/setting-off-a-interval-on-application-launch-in-a-haskell -servant-app) – jberryman

回答

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"预期。

+3

措辞不同。 'm'不是MVar。 –