按类型将消息与处理程序匹配

时间:2014-05-28 09:21:52

标签: haskell event-handling pattern-matching messaging

我有一个大的 open 消息类型集和一个处理程序列表Message -> IO (),每个消息都期望某种类型的消息而忽略所有其他消息。

我需要一个函数anymessage -> [Message -> IO ()] -> IO ()。我可以使用type Message = Dynamic甚至type Message = String(以及show / read)来完成这项工作。

有没有更清洁的解决方案?

1 个答案:

答案 0 :(得分:4)

这听起来像通常的可扩展异常/消息处理程序。参见:

参见例如XMonad's Message class

--
-- User-extensible messages must be a member of this class.
--
class Typeable a => Message a

-- |
-- A wrapped value of some type in the 'Message' class.
--
data SomeMessage = forall a. Message a => SomeMessage a

-- |
-- And now, unwrap a given, unknown 'Message' type, performing a (dynamic)
-- type check on the result.
--
fromMessage :: Message m => SomeMessage -> Maybe m
fromMessage (SomeMessage m) = cast m

-- X Events are valid Messages.
instance Message Event

等等。