今天我想研究是否有可能以这种方式构造数据类型,它不存储其类型签名类型的数据,而是它的另一种表示形式.所以,这是我对GADT的尝试,它具有类型的类型构造函数a,但是类型的数据构造函数ByteString.
{-# LANGUAGE GADTs #-}
import Data.ByteString.Char8
import Data.Serialize
data Serialized a where
MkSerialized :: (Serialize a) => ByteString -> Serialized a
Run Code Online (Sandbox Code Playgroud)
现在我可以decode'通过以下方式定义一个函数:
decode' :: (Serialize a) => Serialized a -> a
decode' (MkSerialized bs) = let Right r = (decode bs) in r
Run Code Online (Sandbox Code Playgroud)
它有效:
let s = MkSerialized (encode "test") :: Serialized String
print $ decode' s -- prints "test"
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,我想Serialized成为一个实例Functor.
instance Functor Serialized where
fmap f (MkSerialized bs) …Run Code Online (Sandbox Code Playgroud)