Будущее ролей для переменных типа 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
и ролей? Что нужно будет реализовать/создать для этого?