我在消息控制台应用程序中使用AMQP library for Haskell。我正在绑定一个这样的消息处理程序:
consumeMsgs ch "tasks" Ack taskHandler
我的问题是consumeMsgs
期望一个带有此签名的消息处理程序:
taskHandler :: (Message, Envelope) -> IO ()
...但我需要传递额外的Channel
和Lock
( Channel
,以便我可以将结果发布到其他队列Lock
用于打印到控制台),如下所示:
taskHandler :: (Message, Envelope) -> Channel -> MVar () -> IO ()
我来自Javascript的土地,但我不希望像全局变量这样的脏解决方案。可以在这做什么?
答案 0 :(得分:3)
我对您的约束条件有点不清楚,但如果您在:param
调用网站上有所需的内容,则可以使用闭包。 (我假设consumeMsgs
是你想要的频道)
ch
(在元组lock <- ...
consumeMsgs ch "tasks" Ack (\(msg,env) -> taskHandler (msg,env) ch lock)
上匹配并不是绝对必要的,因为它只是直接使用,它只是我能想到的最好的名字)
如果您将参数的顺序更改为(msg,env)
,您可以获得具有部分应用的非常惯用的Haskell解决方案:
taskHandler
答案 1 :(得分:2)
这是部分应用程序的用武之地。
如果您将参数的顺序更改为
taskHandler :: Channel -> MVar () -> (Message, Envelope) -> IO ()
然后,您可以将taskHandler
部分应用于Channel
和MVar ()
,即taskHandler channel mvar
。这将返回一个新函数,它正是consumeMsgs
期望的类型。