Giuseppe Maggiore
Giuseppe Maggiore

Reputation: 2031

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

Upvotes: 8

Views: 736

Answers (1)

Ganesh Sittampalam
Ganesh Sittampalam

Reputation: 29110

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.

Upvotes: 7

Related Questions