我正在处理几种不同的协议并将其消息存储在一个频道中。为此,我使用捕获两种类型消息的sum类型。现在我在为UITabBarController
编写解码实例时遇到问题 - 我知道我想要解码哪个协议,但我不知道如何在不使用丑陋的newtype包装器的情况下强制它。代码是:
Binary
有没有更好的方法来解决这个问题?也许用幻影类型?在解码时,我知道我正在处理哪个协议 - 但不知道如何强制它。非常欢迎建议和/或建议!谢谢!
答案 0 :(得分:2)
如果您知道自己只有ProtoA
或ProtoB
条消息,请使用get :: Get ProtoA
或get :: Get ProtoB
进行阅读。如果您知道它是P
,则没有理由尝试阅读ProtoA
。如果您希望P
持有ProtoA
,则可以使用(PA <$> get) :: Get P
。
除非您不知道它是P
还是PA
,否则您不会阅读PB
,因此您的Binary P
实例应该编写一个标记,您可以使用该标记来区分PA
和PB
s。
instance Binary P where
put (PA a) = do put (0 :: Word8)
put a
put (PB b) = do put (1 :: Word8)
put b
get = do t <- get :: Get Word8
case t of
0 -> PA <$> get
1 -> PB <$> get
如果您要将P
写到应该只有ProtoA
或ProtoB
的地方,那么检查并确保这是真的。然后使用put :: ProtoA -> Put
或put :: ProtoB -> Put
。