带和类型的二进制实例

时间:2016-05-11 01:31:19

标签: haskell

我正在处理几种不同的协议并将其消息存储在一个频道中。为此,我使用捕获两种类型消息的sum类型。现在我在为UITabBarController编写解码实例时遇到问题 - 我知道我想要解码哪个协议,但我不知道如何在不使用丑陋的newtype包装器的情况下强制它。代码是:

Binary

有没有更好的方法来解决这个问题?也许用幻影类型?在解码时,我知道我正在处理哪个协议 - 但不知道如何强制它。非常欢迎建议和/或建议!谢谢!

1 个答案:

答案 0 :(得分:2)

如果您知道自己只有ProtoAProtoB条消息,请使用get :: Get ProtoAget :: Get ProtoB进行阅读。如果您知道它是P,则没有理由尝试阅读ProtoA。如果您希望P持有ProtoA,则可以使用(PA <$> get) :: Get P

除非您不知道它是P还是PA,否则您不会阅读PB,因此您的Binary P实例应该编写一个标记,您可以使用该标记来区分PAPB 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写到应该只有ProtoAProtoB的地方,那么检查并确保这是真的。然后使用put :: ProtoA -> Putput :: ProtoB -> Put