2014-08-28 13 views
8

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ę.

Odpowiedz

6

Jako pierwszy, niewielki punkt: to, czy rodzina danych jest zadeklarowana ze zmiennymi typu lub z sygnaturą rodzajową, jest obecnie całkowicie nieistotna, są to po prostu różne składnie tego samego. Od the GHC User's Guide o oświadczeniach rodzinnych dane:

Podobnie jak GADT declarations nazwane argumenty są całkowicie opcjonalne, [...]

Głównym punktem pozostaje, i zostało omówione w this GHC trac thread. Krótkie podsumowanie: Jest to możliwe, poprzez dodanie przypisywania ról i/lub przypisów ról dla rodzin danych/typów, ale nie zostało to jeszcze zaimplementowane.

+0

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. –