haskell - 了解 `modifyMVar_`

标签 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"

我做错了什么?

最佳答案

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/

相关文章:

haskell - 如何将 System.IO.Unsafe 与 TVars 一起使用?

haskell - 我修改后的 zip 版本有什么问题?

function - 了解函数的类型

state - MonadState get 和 put 的原因?

haskell - 为什么我的 Haskell 函数不接受负数?

haskell - 私有(private)数据构造函数上的模式匹配

database - 就适合与 (SQLite) 数据库交互的函数的 Haskell 测试框架提供建议

haskell - Int 和 Integer 有什么区别?

haskell - `([] ==) []`的类型如何推断haskell?

haskell - Haskell 中 2 个列表的笛卡尔积