2015-08-08 4 views
1

Предыдущая версия Data.Messagepack, 0.7.2.5 поддерживает deriving instances via Template Haskell. Текущая версия (1.0.0), однако, doesn't.Как получить экземпляры Data.Messagepack 1.0.0

Мне было интересно узнать, существует ли альтернативный способ автоматического получения экземпляров MessagePack 1.0.0, возможно, используя XDeriveGeneric?

ответ

3

Как затычка меры, посмотрите на msgpack-aeson каталог GitHub репо:

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

Вы можете перейти от данных значений < -> эсон < -> сообщение-пак , Не обязательно эффективный, но удобный, поскольку вы можете автоматически выводить ToJSON и FromJSON с DeriveGeneric.

Пример кода:

{-# 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") 
+0

Не могли бы вы предоставить несколько примеров кода, как это сделать точно? – ManzMoody

+1

Ответ обновлен. – ErikR

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 нарушил бы его.

+0

К сожалению, это для работы с программой, написанной на другом языке, которая даже не поддерживает типы сумм, поэтому их отсутствие в этом случае не является серьезной проблемой. – LogicChains

+0

Родовые классы, на которые я не писал, будут отвечать на http://stackoverflow.com/q/32107706/414413 – Cirdec