【发布时间】:2018-05-04 02:18:41
【问题描述】:
我使用 State Monad Transformer 来管理这样的全局状态
data State = State ...
StateT State IO ()
我使用amqp 来使用来自 RabbitMQ 的消息。状态将根据收到的消息进行修改。该函数的类型为
consumeMsgs :: Channel
-> Text
-> Ack
-> ((Message, Envelope) -> IO ()) -- ^ the callback function
-> IO ConsumerTag
现在我们可以忽略其他参数,但第三个参数是我将提供的回调函数以及修改发生的位置。
因为它主要是一个IO Monad,所以我使用这个函数如下
consumeMsgs chan queue Rmq.Ack (flip evalStateT ssss . rmqCallback)
这里ssss是我输入的状态,我发现在我的回调函数rmqCallback的过程中可以正确修改状态。但是,每次下一次回调发生时,全局状态都与调用 consumeMsgs 之前相同或等于ssss。
我了解 State Monad 只是一个需要初始状态来输入并在整个过程中保持状态的过程,但与 Monad 之外的状态无关(我错过了什么吗?),所以我指望 MVar保持和修改状态,这是有效的。我想知道还有其他方法可以处理这个问题,也许是另一个 Monad?
【问题讨论】:
标签: haskell