gpt4 book ai didi

haskell - 这个 GADT 是否真的具有类型角色代表性

转载 作者:行者123 更新时间:2023-12-03 15:25:12 26 4
gpt4 key购买 nike

此数据类型可以有 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)

我有一个类 convert between these two representations ,这样 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)

我也可以简单地定义一个 UnFoo类型函数类似于 Prime .

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

所以仍然有理由说,正如你在标题中所建议的那样, l具有类型角色表示,因为很明显 HList l1HList l2如果 l1 具有相同的表示和 l2有相同的表示。

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

关于haskell - 这个 GADT 是否真的具有类型角色代表性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24222552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com