我试图在Haskell中序列化数据类型,并想知道如何序列化GADT。我尝试的方法看起来类似于(使用Control.DeepSeq):
data Gadt a where
Cons1 :: Int -> Gadt Int
Cons2 :: Bool -> Gadt Bool
instance NFData Cons1 where rnf = genericRnf
instance NFData Cons2 where rnf = genericRnf
deriveSafeCopy ......但是,这并不能编译: GHC告诉我Cons1和Cons2不是有效的构造函数。我可以很好地序列化标准数据类型。序列化GADT的最佳方法是什么?
我想序列化GADT的原因是因为此数据类型是用于我的项目的Redis数据库中的一个键。
发布于 2016-02-15 20:31:00
免责声明
如@luqui所指出的,generics 没有回答关于的问题
好的,原来你的定义很奇怪(注意,a in Cons1 :: a ->是一个forall a,与Gadt a中的a没有关系--我看不出你在这里做了什么--抱歉)
基本上,你可以把任何你想要的值放在那里,就像
- Cons1 "Hello" -- :: Gadt Int
- Cons2 'c' -- :: Gadt Bool
- Cons2 [1,2,3] -- :: Gadt Bool所有这些都会给您提供一个Gadt Int或Gadt Bool --但是当您在其上设置匹配模式时,就没有办法用这个值做任何有意义的事情,因为它实际上可能是任何东西(包括一些不是NFData本身的实例的东西)。
但是原则上,您声明实例就像使用普通的ADT一样--也就是说,在这里为不同的情况定义rnf。
假设我把你的GADT改为:
data Gadt a where
Cons1 :: Int -> Gadt Int
Cons2 :: Bool -> Gadt Bool那么这个实例声明就可以了:
instance NFData (Gadt a) where
rnf (Cons1 a) = rnf a
rnf (Cons2 a) = rnf a https://stackoverflow.com/questions/35418256
复制相似问题