2017-10-28 34 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。 –