首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell中GADT的通用实例

Haskell中GADT的通用实例
EN

Stack Overflow用户
提问于 2016-02-15 20:15:47
回答 1查看 944关注 0票数 1

我试图在Haskell中序列化数据类型,并想知道如何序列化GADT。我尝试的方法看起来类似于(使用Control.DeepSeq):

代码语言:javascript
复制
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数据库中的一个键。

EN

回答 1

Stack Overflow用户

发布于 2016-02-15 20:31:00

免责声明

如@luqui所指出的,generics 没有回答关于的问题

好的,原来你的定义很奇怪(注意,a in Cons1 :: a ->是一个forall a,与Gadt a中的a没有关系--我看不出你在这里做了什么--抱歉)

基本上,你可以把任何你想要的值放在那里,就像

代码语言:javascript
复制
- Cons1 "Hello" -- :: Gadt Int
- Cons2 'c'     -- :: Gadt Bool
- Cons2 [1,2,3] -- :: Gadt Bool

所有这些都会给您提供一个Gadt IntGadt Bool --但是当您在其上设置匹配模式时,就没有办法用这个值做任何有意义的事情,因为它实际上可能是任何东西(包括一些不是NFData本身的实例的东西)。

但是原则上,您声明实例就像使用普通的ADT一样--也就是说,在这里为不同的情况定义rnf

假设我把你的GADT改为:

代码语言:javascript
复制
data Gadt a where 
  Cons1 :: Int  -> Gadt Int
  Cons2 :: Bool -> Gadt Bool

那么这个实例声明就可以了:

代码语言:javascript
复制
instance NFData (Gadt a) where
    rnf (Cons1 a) = rnf a
    rnf (Cons2 a) = rnf a 
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35418256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档