2011-11-13 14 views
6

In Associated Type Synonyms (Chakravarty, Keller, Jones) la carta sembra indicare che vale quanto segue:È possibile avere un sinonimo di tipo associato con variabili non menzionate nella classe di tipo?

class C a where 
    type S a (k :: * -> *) :: * 

Tuttavia, quando provo ed eseguire questo ottengo un errore di compilazione (con -XTypeFamilies):

Not in scope: type variable `k' 

Mi manca qualcosa o l'effettiva implementazione in GHC non è uguale a quella riportata nel documento?

+0

Ora ho trovato http://hackage.haskell.org/trac/ghc/ticket/3714 che per me legge come se ciò non fosse possibile. Se questo è corretto, non esitate a rispondere con quello. – ocharles

risposta

4

Come già scoperto, this is not possible in GHC:

Esattamente come nel caso di una dichiarazione di dati associati, i parametri di tipo di nome deve essere una permutazione di un sottoinsieme dei parametri di classe. Esempi

class C a b c where { type T c a :: * } -- OK 
class D a where { type T a x :: * }  -- No: x is not a class parameter 
class D a where { type T a :: * -> * } -- OK 

Il biglietto lei ha fatto riferimento al spiega in realtà il motivo per non essere in grado di definire qualcosa come S. Funziona in questo modo:

class C a where 
    type S a :: (* -> *) -> * 
data TupK a k = TupK (a, k a) 
instance C [a] where 
    type S [a] = TupK a 

Tuttavia, ora sei bloccato con un nuovo tipo di dati. L'uso dei sinonimi di tipo non funzionerà ("Il sinonimo di tipo TupK dovrebbe avere 2 argomenti"), e l'aggiunta di ulteriori parametri a S non aiuterà ("Il numero di parametri deve corrispondere alla dichiarazione di famiglia, attesa 1"), come documentato nel biglietto.

+0

Bummer, ma grazie per la risposta dettagliata! – ocharles

+1

@ocharles Vorrei aggiungere che non è * necessario * usare un tipo * associato *. Si potrebbe benissimo fare qualcosa come 'type family S a (k :: * -> *); classe C a dove foo :: S a [] -> Int'. Il vantaggio principale dei tipi associati è che rende più semplice per il compilatore dare buoni messaggi di errore (e una sintassi più comoda per la dichiarazione delle istanze di tipo). –

+0

Sì, per ora ho separato il 2, ma è stato bello averli abbinati – ocharles

1

No, ma si può fare il meno potente:

class C a where 
    type S a :: (k :: * -> *) -> * 

... che potrebbe servire allo stesso scopo se non è necessario il potere supplementare.

Problemi correlati