2015-06-11 16 views
9

dato un ADT comecostruttore che solleva (via DataKinds) per * -> Un

data K = A | B Bool 

l'estensione DataKinds ci permette di sollevare in generi e tipi/costruttori di tipo

K :: BOX 
'A :: K 
'B :: 'Bool -> K 

C'è un modo per aggiungere un costruttore per K che solleva al tipo di costruttore di

'C :: * -> K 

?

risposta

7

Come afferma Conor, questo non è direttamente possibile. È possibile, tuttavia, definire

data K a = ... | C a 

Allora questo promuove a

C :: a -> K a 

Se quindi si utilizza K *, è possibile ottenere ciò che si desidera.

5

Al momento, ho paura di no. Non ho individuato nemmeno una soluzione ovvia.

This ticket documenta le prospettive per la dichiarazione di tipi di dati, tipo nato, piuttosto che essere tipi di dati con gentilezza che vengono loro attribuiti. Sarebbe del tutto ragionevole che i costruttori di queste cose impacchettino i tipi che si propongono. Non siamo ancora arrivati, ma non sembra così problematico.

I miei occhi hanno un premio maggiore. Vorrei che * fosse un tipo di valori di runtime perfettamente sensato, in modo che il tipo che desideri possa esistere con la promozione come lo abbiamo oggi. Combinatelo con la nozione contrariata di pi -tipo (astrazione non parametrica sulla porzione di linguaggio che è effettivamente condivisa da tipi e valori) e potremmo ottenere un modo più diretto di creare astrazioni di tipo ad hoc rispetto a Data.Typeable. Il solito forall rimarrebbe parametrico.

+0

Gli obiettivi dichiarati di Rich Eisen con il suo progetto GHC dipendente soddisfano anche i tuoi obiettivi? – Carl