以前版本的Data.Messagepack,0.7.2.5支持通过模板Haskell派生实例。但是,当前版本(1.0.0)是不会。
因此,我想知道是否有一种方法可以自动派生MessagePack 1.0.0实例,可能使用XDeriveGeneric
发布于 2015-08-08 14:26:13
作为止损措施,请查看msgpack-aeson github的message-pack目录:
https://github.com/msgpack/msgpack-haskell/tree/master/msgpack-aeson
你可以从你的数据值<->埃森<->信息包。不一定有效率,但很方便,因为您可以用ToJSON自动派生DeriveGeneric和FromJSON。
示例代码:
{-# LANGUAGE DeriveGeneric, OverloadedStrings #-}
import Data.MessagePack.Aeson
import qualified Data.MessagePack as MP
import GHC.Generics
import Data.Aeson
data Foo = Foo { _a :: Int, _b :: String }
deriving (Generic)
instance ToJSON Foo
instance FromJSON Foo
toMsgPack :: Foo -> Maybe MP.Object
toMsgPack = decode . encode
test = toMsgPack (Foo 3 "asd")发布于 2015-08-08 16:31:36
您可以编写自己的GMessagePack类,并通过派生Generic获取实例。我试着回答这个问题,但我不能推荐它。msgpack不支持和,而Maybe的编码非常糟糕。
instance MessagePack a => MessagePack (Maybe a) where
toObject = \case
Just a -> toObject a
Nothing -> ObjectNil
fromObject = \case
ObjectNil -> Just Nothing
obj -> fromObject objMaybes的编码不能区分Nothing :: Maybe (Maybe a)和Just Nothing :: Maybe (Maybe a)之间的区别,两者都将被编码为ObjectNil,并被解码为Nothing。如果我们对MessagePack实例强制使用明显的fromObject . toObject == pure定律,那么MessagePack的这个实例就会违反它。
https://stackoverflow.com/questions/31892857
复制相似问题