Questo tipo di dati può avere type role HCons' representational representational
, che consente di utilizzare coerce
per aggiungere o rimuovere i newtypes applicati agli elementi, senza la necessità di attraversare l'elenco.questo GADT ha effettivamente il ruolo di tipo rappresentativo
data HNil' = HNil'
data HCons' a b = HCons' a b
Tuttavia la sintassi per tali elenchi non è così bello come quelli con il seguente GADT
data HList (l::[*]) where
HNil :: HList '[]
HCons :: e -> HList l -> HList (e ': l)
Ho una classe di convert between these two representations, in modo tale che Prime (HList [a,b]) ~ HCons' a (HCons' b HNil')
. Quella lezione rende
coerceHList :: Coercible (Prime a) (Prime b) => HList a -> HList b
coerceHList = unsafeCoerce
sicuro?
FWIW, si, penso di si. Ma non conosco abbastanza gli interni dei ruoli per fare un argomento convincente. Il tuo esempio sembra essere un altro caso in cui l'attuale sistema di ruolo non è abbastanza espressivo. – kosmikus