Перекрывающиеся экземпляры Haskell и функции типов - PullRequest
8 голосов
/ 16 декабря 2010

У меня есть следующий класс типов, который моделирует оптимизацию 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

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

1 Ответ

7 голосов
/ 16 декабря 2010

Запрещено иметь перекрывающиеся экземпляры с семействами типов. Подробнее см. Руководство GHC , "Перекрытие экземпляров синонимов типа".

Причина в том, что наличие двух разных возможных результатов для применения функции типа в зависимости от доступных экземпляров может привести к ошибкам.

...