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



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow