如何派生Data.Messagepack 1.0.0的实例

时间:2015-08-08 11:55:31

标签: haskell msgpack

以前版本的Data.Messagepack0.7.2.5支持deriving instances via Template Haskell。但是,当前版本(1.0.0)doesn't

我当时想知道是否有另一种方法可以自动派生MessagePack 1.0.0实例,可能使用XDeriveGeneric

2 个答案:

答案 0 :(得分:3)

作为一种权宜之计,请查看getBenefAccount().getNumber() github repo的msgpack-aeson目录:

https://github.com/msgpack/msgpack-haskell/tree/master/msgpack-aeson

你可以从你的数据值< - > aeson< - >消息包。不一定高效,但方便,因为您可以使用message-pack自动派生ToJSON和FromJSON。

示例代码:

DeriveGeneric

答案 1 :(得分:2)

您可以编写自己的GMessagePack类,并通过派生Generic来获取实例。我试着回答这个问题,但我无法推荐。 msgpack不支持和,而one sum type supported by the Haskell msgpack library, Maybe的编码非常差。

instance MessagePack a => MessagePack (Maybe a) where
  toObject = \case
    Just a  -> toObject a
    Nothing -> ObjectNil

  fromObject = \case
    ObjectNil -> Just Nothing
    obj -> fromObject obj

Maybe的编码无法区分Nothing :: Maybe (Maybe a)Just Nothing :: Maybe (Maybe a),两者都会被编码为ObjectNil并解码为Nothing }。如果我们将MessagePack个实例强加给显而易见的法律fromObject . toObject == pure,则MessagePack的此实例会违反它。