【发布时间】:2015-08-08 11:55:30
【问题描述】:
Data.Messagepack、0.7.2.5之前的版本支持deriving instances via Template Haskell。但是,当前版本 (1.0.0),doesn't。
因此我想知道是否有另一种方法可以自动派生 MessagePack 1.0.0 实例,可能使用XDeriveGeneric?
【问题讨论】:
Data.Messagepack、0.7.2.5之前的版本支持deriving instances via Template Haskell。但是,当前版本 (1.0.0),doesn't。
因此我想知道是否有另一种方法可以自动派生 MessagePack 1.0.0 实例,可能使用XDeriveGeneric?
【问题讨论】:
作为权宜之计,请查看message-pack github repo 的msgpack-aeson 目录:
https://github.com/msgpack/msgpack-haskell/tree/master/msgpack-aeson
你可以从你的数据值 aeson 消息包中去。不一定高效,但很方便,因为您可以使用 DeriveGeneric 自动派生 ToJSON 和 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")
【讨论】:
您可以编写自己的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
Maybes 的编码无法区分Nothing :: Maybe (Maybe a) 和Just Nothing :: Maybe (Maybe a),两者都将编码为ObjectNil,解码为Nothing。如果我们要对MessagePack 实例施加明显的法律fromObject . toObject == pure,那么MessagePack 的这个实例就会违反它。
【讨论】: