我有一个大的 open 消息类型集和一个处理程序列表Message -> IO ()
,每个消息都期望某种类型的消息而忽略所有其他消息。
我需要一个函数anymessage -> [Message -> IO ()] -> IO ()
。我可以使用type Message = Dynamic
甚至type Message = String
(以及show
/ read
)来完成这项工作。
有没有更清洁的解决方案?
答案 0 :(得分:4)
这听起来像通常的可扩展异常/消息处理程序。参见:
--
-- 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
等等。