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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With