Перекрывающиеся экземпляры и функции типов Haskell

У меня есть следующий класс типов, который моделирует SQL -подобная оптимизация запроса:

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

проблема в том, что я получаю сообщение об ошибке «Конфликт объявления экземпляров семейства» в функции оптимизированного типа. Почему это так и как я могу это решить? Было бы неплохо иметь "запасной экземпляр" вместо того, чтобы исчерпывать все случаи (которых может быть довольно много) ...

8
задан Don Stewart 12 May 2011 в 03:23
поделиться