传递的功能与预期的签名不同

时间:2016-04-16 18:49:06

标签: haskell functional-programming amqp

我在消息控制台应用程序中使用AMQP library for Haskell。我正在绑定一个这样的消息处理程序:

  consumeMsgs ch "tasks" Ack taskHandler

我的问题是consumeMsgs期望一个带有此签名的消息处理程序:

taskHandler :: (Message, Envelope) -> IO ()

...但我需要传递额外的ChannelLock Channel,以便我可以将结果发布到其他队列Lock用于打印到控制台),如下所示:

taskHandler :: (Message, Envelope) -> Channel -> MVar () -> IO ()

我来自Javascript的土地,但我不希望像全局变量这样的脏解决方案。可以在这做什么?

2 个答案:

答案 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部分应用于ChannelMVar (),即taskHandler channel mvar。这将返回一个新函数,它正是consumeMsgs期望的类型。