我使用状态单子转换器来管理全局状态,如下所示:
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?