I have the following typeclass which models a SQL-like query optimization:
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
the problem is that I get the error "Conflicting family instance declarations" on the Optimized type function. Why is that and how can I solve it? It would really be nice to have a "fallback instance" instead of having to exhaust all cases (which might be quite many)...
It's illegal to have overlapping instances with type families. See the GHC manual, "Overlap of type synonym instances" for details.
The reason is that having two different possible results for a type function application depending on the available instances can lead to unsoundness.
精彩评论