开发者

Haskell overlapping instances and type functions

开发者 https://www.devze.com 2023-01-31 03:54 出处:网络
I have the following typeclass which models a SQL-like query optimization: class OptimizableQuery q where

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消