Haskell Language
Ruolo
Ricerca…
introduzione
L'estensione della lingua TypeFamilies
consente al programmatore di definire le funzioni a livello di TypeFamilies
. Ciò che distingue le funzioni di tipo dai costruttori di tipi non GADT è che i parametri delle funzioni di tipo possono essere non parametrici mentre i parametri dei costruttori di tipi sono sempre parametrici. Questa distinzione è importante per la correttezza dell'estensione GeneralizedNewTypeDeriving
. Per spiegare questa distinzione, i ruoli vengono introdotti in Haskell.
Osservazioni
Vedi anche SafeNewtypeDeriving
.
Ruolo nominale
Haskell Wiki ha un esempio di parametro non parametrico di una funzione tipo:
type family Inspect x
type instance Inspect Age = Int
type instance Inspect Int = Bool
Qui x
non è parametrico perché per determinare l'esito dell'applicazione di Inspect
su un argomento di tipo, la funzione type deve ispezionare x
.
In questo caso, il ruolo di x
è nominale. Possiamo dichiarare esplicitamente il ruolo con l'estensione RoleAnnotations
:
type role Inspect nominal
Ruolo rappresentativo
Un esempio di parametro parametrico di una funzione di tipo:
data List a = Nil | Cons a (List a)
type family DoNotInspect x
type instance DoNotInspect x = List x
Qui x
è parametrico perché per determinare l'esito dell'applicazione di DoNotInspect
a un argomento di tipo, la funzione tipo non ha bisogno di ispezionare x
.
In questo caso, il ruolo di x è rappresentativo. Possiamo dichiarare esplicitamente il ruolo con l'estensione RoleAnnotations
:
type role DoNotInspect representational
Ruolo fantasma
Un parametro di tipo fantasma ha un ruolo fantasma. I ruoli fantasma non possono essere dichiarati esplicitamente.