Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Haskell overlapping instances and type functions

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)...

like image 502
Giuseppe Maggiore Avatar asked Dec 16 '10 16:12

Giuseppe Maggiore


1 Answers

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.

like image 193
GS - Apologise to Monica Avatar answered Oct 16 '22 02:10

GS - Apologise to Monica