Будущее ролей для переменных типа GADT?

A со вчерашнего дня имело определение HList (из HList), который использует семейства данных. В основном:

data family HList (l :: [*])
data instance HList '[] = HNil
newtype instance HList (x ': xs) = HCons1 (x, HList xs)

pattern HCons x xs = HCons1 (x, xs)

вместо обычного (более элегантное и интуитивно понятное ИМО) определение GADT

data HList (l :: [*]) where
  HNil :: HList '[]
  HCons :: x -> HList xs -> HList (x ': xs)

Это связано с тем, что семейство семейств данных позволяет нам принуждать (мы можем только принуждать дело HList (x ': xs), так как это newtype instance, но этого достаточно), тогда как GADT имеет только номинальную роль для l (таким образом блокируя любое принуждение). (Мой ответ на упомянутый вопрос имеет конкретный пример этого.)

Ошибки системы ролей для GADT по отношению к HList обсуждаются в этом двухлетнем вопросе. В принципе, GHC автоматически маркирует любую переменную типа GADT как номинальную.

Учитывая, что с тех пор прошло некоторое время, и говорят о том, что роли ролей более гибкие вокруг семейств типов/данных, есть ли какой-либо путь вперед (т.е. какая-то существующая идея, какой-то открытый билет Trac, что-нибудь действительно) для проверки более интересных ролей в GADT (например, HList)? Существуют ли какие-то фундаментальные ограничения здесь с GADT или взаимодействием DataKinds и ролей? Что нужно будет реализовать/создать для этого?

Ответы