Этот тип данных может иметь 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
безопасно?