Вы можете написать свой собственный 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
нарушил бы его.
Не могли бы вы предоставить несколько примеров кода, как это сделать точно? – ManzMoody
Ответ обновлен. – ErikR