繁体   English   中英

这个GADT实际上是否具有代表性的类型角色

[英]does this GADT actually have type role representational

此数据类型可以具有type role HCons' representational representational ,它允许使用coerce来添加或删除应用于元素的新类型,而无需遍历列表。

data HNil' = HNil'
data HCons' a b = HCons' a b

但是,这些列表的语法不如具有以下GADT的语法好

data HList (l::[*]) where
    HNil  :: HList '[]
    HCons :: e -> HList l -> HList (e ': l)

我有一个类在这两个表示之间进行转换 ,例如Prime (HList [a,b]) ~ HCons' a (HCons' b HNil') 该课程是否成功?

coerceHList :: Coercible (Prime a) (Prime b) => HList a -> HList b
coerceHList = unsafeCoerce

安全?

我认为转换本身并不足够。 例如,以下内容还允许我在GADT和一对强制类型之间进行转换,但直接强制GADT肯定不安全:

newtype Age = Age Int

data Foo a where
   I :: Bool -> Int -> Foo Int
   A :: Age -> Bool -> Foo Age

class ConvFoo a where
   toFoo :: (Bool, a) -> Foo a
   fromFoo :: Foo a -> (Bool, a)

instance ConvFoo Int where
   toFoo (b, i) = I b i
   fromFoo (I b i) = (b, i)

instance ConvFoo Age where
   toFoo (b, a) = A a b
   fromFoo (A a b) = (b, a)

我也可以简单地定义一个类似于PrimeUnFoo类型函数。

我认为两个例子之间的关键区别在于,在我的中, AgeInt确实具有相同的表示,而在你的'[]e':l没有相同的表示。

所以仍然有一种情况可以说,正如你在标题中所建议的那样, l具有类型角色代表性,因为如果l1l2具有相同的表示,则HList l1HList l2具有相同的表示是显而易见的。

然而,由于在理论上表示是依赖于实现的,所以我认为在GHC直接接受它之前你不能认为这绝对安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM