今天我想研究是否有可能以这样一种方式构造一个数据类型,它不存储其类型签名的类型的数据,而是存储它的另一种表示。所以,这是我尝试的 GADT,它具有 type 的类型构造函数a
,但具有 type 的数据构造函数ByteString
。
{-# LANGUAGE GADTs #-}
import Data.ByteString.Char8
import Data.Serialize
data Serialized a where
MkSerialized :: (Serialize a) => ByteString -> Serialized a
现在我可以decode'
通过以下方式定义一个函数:
decode' :: (Serialize a) => Serialized a -> a
decode' (MkSerialized bs) = let Right r = (decode bs) in r
它有效:
let s = MkSerialized (encode "test") :: Serialized String
print $ decode' s -- prints "test"
我现在的问题是我想Serialized
成为Functor
.
instance Functor Serialized where
fmap f (MkSerialized bs) = MkSerialized (encode (f (right (decode bs))))
where right (Right r) = r
但是我得到错误(Serialize b)无法推断。如何约束 Functor 实例,以便Serialize
在fmap
?