Haskell Language
Rola
Szukaj…
Wprowadzenie
TypeFamilies
języka TypeFamilies
pozwala programiście definiować funkcje na poziomie typu. To, co odróżnia funkcje typu od konstruktorów innych niż GADT, polega na tym, że parametry funkcji typu mogą być nieparametryczne, podczas gdy parametry konstruktorów typu są zawsze parametryczne. To rozróżnienie jest ważne dla poprawności rozszerzenia GeneralizedNewTypeDeriving
. Aby wyjaśnić to rozróżnienie, role zostały wprowadzone w Haskell.
Uwagi
Zobacz także SafeNewtypeDeriving
.
Nominalna rola
Haskell Wiki ma przykład parametru nieparametrycznego funkcji typu:
type family Inspect x
type instance Inspect Age = Int
type instance Inspect Int = Bool
Tutaj x
jest nieparametryczny, ponieważ aby określić wynik zastosowania polecenia Inspect
do argumentu type, funkcja type musi sprawdzić x
.
W tym przypadku rola x
jest nominalna. Możemy wyraźnie zadeklarować rolę za pomocą rozszerzenia RoleAnnotations
:
type role Inspect nominal
Rola reprezentacyjna
Przykład parametru parametrycznego funkcji typu:
data List a = Nil | Cons a (List a)
type family DoNotInspect x
type instance DoNotInspect x = List x
Tutaj x
jest parametryczne, ponieważ aby określić wynik zastosowania DoNotInspect
do argumentu typu, funkcja typu nie musi sprawdzać x
.
W tym przypadku rola x jest reprezentatywna. Możemy wyraźnie zadeklarować rolę za pomocą rozszerzenia RoleAnnotations
:
type role DoNotInspect representational
Widmowa rola
Parametr typu fantomowego pełni rolę fantomową. Ról fantomowych nie można jawnie zadeklarować.