2010-12-16 16 views
8

Ho la seguente typeclass che modella un'ottimizzazione query SQL-like:Haskell sovrapposte istanze e funzioni di tipo

class OptimizableQuery q where 
    type Optimized q :: * 
    optimize :: q -> Optimized q 

instance Query q => OptimizableQuery q where 
    type Optimized q = q 
    optimize q = q 

instance (Query q, OptimizableQuery q) => OptimizableQuery (Select (Select q p) p) where 
    type Optimized (Select (Select q p) p) = Select (Optimized q) p 
    optimize (Select (Select q _) p) = Select (optimize q) p 

il problema è che ottengo l'errore "dichiarazioni di istanza famiglia conflitto" sulla funzione di tipo ottimizzata. Perché è questo e come posso risolverlo? Sarebbe davvero bello avere una "istanza di fallback" invece di dover esaurire tutti i casi (che potrebbero essere molti) ...

risposta

7

È illegale avere istanze sovrapposte con famiglie di tipi. Vedere lo GHC manual, "Sovrapposizione di istanze di tipo sinonimo" per i dettagli.

Il motivo è che avere due diversi risultati possibili per un'applicazione di tipo funzione a seconda delle istanze disponibili può portare a una mancanza di integrità.

+0

Come posso aggirare questo? –

+0

Non riesco a pensare a soluzioni alternative oltre a esaurire tutti i casi. Scusate! –