question from yesterday定义了使用数据系列的HList
(来自HList
包)。基本上是:
data family HList (l :: [*])
data instance HList '[] = HNil
newtype instance HList (x ': xs) = HCons1 (x, HList xs)
pattern HCons x xs = HCons1 (x, xs)
而不是通常的(IMO更优雅和直观)GADT定义
data HList (l :: [*]) where
HNil :: HList '[]
HCons :: x -> HList xs -> HList (x ': xs)
这是因为数据系列版本让我们强制(我们只能强制HList (x ': xs)
案例,因为它是newtype instance
,但这就足够了),而GADT只推断名义角色为l
(从而阻止任何胁迫)。 (My answer to the mentioned question has a concrete example of this。)
HList
讨论了GADT角色系统相对于HList
的失败。基本上,GHC会自动标记任何类似GADT的"类型变量为名义。
鉴于从那时起已经过了一段时间two year old question,是否有任何前进路径(即一些现有的想法,一些开放的Trac票,真的是什么)来检查GADT中更有趣的角色(如{{1} })? GADT或DataKinds
和角色的相互作用是否存在一些基本限制?为实现这一目标需要实施/创建什么?