2010-12-16 15 views
8

tengo la siguiente clase de tipos que modela una optimización de consultas similar a SQL:Haskell superpuestas instancias y funciones de 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 

el problema es que me sale el error "declaraciones de instancias de la familia en conflicto" en la función de tipo optimizado. ¿Por qué es eso y cómo puedo resolverlo? Sería bueno tener una "instancia alternativa" en lugar de tener que agotar todos los casos (que podría ser bastante) ...

Respuesta

7

Es ilegal tener instancias superpuestas con familias de tipos. Consulte el GHC manual, "Superposición de instancias de sinónimos de tipo" para obtener más información.

La razón es que tener dos resultados posibles diferentes para una aplicación de función de tipo dependiendo de las instancias disponibles puede provocar falta de solidez.

+0

¿Cómo puedo solucionar esto? –

+0

No puedo pensar en ninguna solución aparte de agotar todos los casos. ¡Lo siento! –

Cuestiones relacionadas