2011-09-23 16 views
8

Sono solo curioso perché devo scrivere questo,spiegazione per "famiglia sinonimo di tipo illegale"

instance (HzMonad , Data.Suitable.Suitable α, γ ~ ExprTyp α) => VarDecl γ where 
    var = varhz 

invece di questo

instance (HzMonad , Data.Suitable.Suitable α) => VarDecl (ExprTyp α) where 
    var = varhz 

-- error 
Hz2/Language.hs:114:53: 
    Illegal type synonym family application in instance: ExprTyp α 
    In the instance declaration for `VarDecl (ExprTyp α)' 

dove

varhz :: 
    (HzMonad , Data.Suitable.Suitable α) => 
    String -> ExprTyp α -> (ExprTyp α) 

Che cosa è la tilde comunque? Grazie mille.

+3

Non ho l'energia (stasera) per scrivere una risposta completa, ma la risposta breve è che questo è ancora un altro esempio di ipotesi profondamente radicate sulle cose a livello di testo essendo iniettive che si rivelano false quando si scrive le famiglie vengono aggiunte al mix. La tilde è un'asserzione di uguaglianza di tipo. –

+0

Ah, capisco ora, nessun problema. Grazie per il messaggio. Come girarlo è un'altra storia, che sto ancora cercando di capire. – gatoatigrado

risposta

2

Penso che il problema sia che tutto sul lato destro di => deve essere un costruttore di tipi o una variabile di tipo. ExprTyp potrebbe fare riferimento a più costruttori di tipo Differet. Sostituire questo con un vincolo di uguaglianza funzionerà, ma l'istanza risultante sarà effettivamente inutile, dal momento che il compilatore non sarà in grado di dedurre nulla su γ dato che si tratta di un ExprTyp - ExprTyp potrebbe essere alterato a qualsiasi cosa.

Nella mia situazione - Sto provando a scrivere un monad DSL - la soluzione è di avvolgere tutti gli usi del tipo associato in un costruttore newtype. Ad esempio, se si parte con,

class MyDSL m a where 
    type ExprTyp m :: * -> * 
    printE :: ExprTyp m a -> m() 

poi avvolgere questo si tradurrà in

newtype ExprT a = ExprT a 
class MyDSL m a where 
    type ExprTyp m :: * -> * 
    printE :: ExprT (ExprTyp m a) -> m() 

Quindi, ad esempio, le dichiarazioni delle variabili (stavo scrivendo codice per le dichiarazioni delle variabili tupled) potrebbe essere,

instance (HzMonad , Data.Suitable.Suitable α, γ ~ ExprTyp α) => VarDecl (ExprT γ) 
instance (Monad , VarDecl α, VarDecl β) => VarDecl (α, β) 

Si prega di inviare un commento se qualcosa non è chiaro.

Problemi correlati