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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow