Rozumiem, dlaczego nowe role system and annotations wymagają parametrów rodziny typów (i danych), aby spełniać rolę nominal
.Nominalne role i rodziny danych
więc spodziewać, kiedy oświadczyłem
data family CoordinateRepresentation ty a :: *
że ty
i a
dostanie nominal
role. (Mój aktualny przykład to powiązana rodzina danych, ale ponieważ nie sądzę, żeby coś zmieniło, pomijam dodatkowy hałas, który się z tym wiąże.)
Nie spodziewałem się, że gdy zmienię go na
jest to, że nienazwany argument drugiego typu nadal otrzymuje rolę nominal
.
Dlaczego tak jest? Czy nie można bezpiecznie uzyskać roli representational
, ponieważ nie trzeba tworzyć nowego konstruktora, aby uzyskać data instance CoordinateRepresentation ... = ...
? W jaki sposób konstruktor ten może używać swojego parametru w roli nominal
w sposób, którego kompilator nie widzi? Mimo że jest to system otwarty i istnieje osobna kompilacja, nadal go nie dostaję.
Ah, rozumiem. Spodziewałem się, że druga składnia ograniczy część "typu dopasowywania" rodziny typów do pierwszego argumentu i wymagać, aby wynikowe "* -> *" było w pewnym sensie "zwykłe", ale tak nie jest. –