[英]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)
我也可以简单地定义一个类似于Prime
的UnFoo
类型函数。
我认为两个例子之间的关键区别在于,在我的中, Age
和Int
确实具有相同的表示,而在你的'[]
和e':l
没有相同的表示。
所以仍然有一种情况可以说,正如你在标题中所建议的那样, l
具有类型角色代表性,因为如果l1
和l2
具有相同的表示,则HList l1
和HList l2
具有相同的表示是显而易见的。
然而,由于在理论上表示是依赖于实现的,所以我认为在GHC直接接受它之前你不能认为这绝对安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.