Этот тип данных может содержать type role HCons' representational representational
, что позволяет использовать coerce
для добавления или удаления новых типов, применяемых к элементам, без необходимости перебирать список.делает это GADT действительно имеющим представление роли типа
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
сейф?
FWIW, да, я так думаю. Но я не знаю достаточно о внутренних ролях, чтобы на самом деле сделать убедительный аргумент. Ваш пример, похоже, является другим случаем, когда текущая система ролей недостаточно выразительна. – kosmikus