Vraag Toekomst van rollen voor GADT-achtige typevariabelen?


EEN vraag van gisteren had een definitie van HList (van de HList pakket) dat gegevensfamilies gebruikt. Eigenlijk:

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

pattern HCons x xs = HCons1 (x, xs)

in plaats van de gebruikelijke (IMO meer elegante en intuïtieve) GADT-definitie

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

Dit komt omdat de datafamilieversie ons dwingt te dwingen (we krijgen alleen de dwang om de HList (x ': xs) geval omdat het een is newtype instance, maar dat is genoeg), terwijl de GADT slechts een nominale rol afleidt voor l (waardoor elke dwang wordt geblokkeerd). (Mijn antwoord op de genoemde vraag heeft hier een concreet voorbeeld van.)

De tekortkomingen van het rollensysteem voor GADT's met betrekking tot HList worden hierin besproken twee jaar oude vraag. In principe markeert GHC automatisch elke "GADT-achtig" type variabele als nominaal.

Aangezien er sindsdien enige tijd verstreken is en er wordt gesproken over het flexibeler maken van rollen rond type / gegevensfamilies, is er een pad voorwaarts (dat wil zeggen, een bestaand idee, een open Trac-ticket, eigenlijk iets) voor het controleren van meer interessante rollen in GADT's (zoals HList)? Zijn er enkele fundamentele beperkingen hier met GADT's of het samenspel van DataKinds en rollen? Wat zou moeten worden geïmplementeerd / gemaakt om dit te laten werken?


17
2017-12-15 06:50


oorsprong


antwoorden: