В отчёте Haskell не вполне ясно указано, когда допустимо объявление deriving. Например:
data T0 f a = MkT0 a deriving( Eq ) data T1 f a = MkT1 (f a) deriving( Eq ) data T2 f a = MkT2 (f (f a)) deriving( Eq )
Естественный сгенерированный код Eq привёл бы к следующим объявлениям экземпляров:
instance Eq a => Eq (T0 f a) where ... instance Eq (f a) => Eq (T1 f a) where ... instance Eq (f (f a)) => Eq (T2 f a) where ...
Первое из них, очевидно, корректно. Второе тоже корректно, хотя это не так очевидно. Третье не соответствует Haskell 98 и может привести к потере завершаемости экземпляров.
GHC придерживается консервативного подхода: он принимает первые два, но не третье. Правило таково: каждое ограничение в выведенном контексте экземпляра должно состоять только из переменных типов, без повторений.
Это правило применяется независимо от флагов. Если вам нужен более экзотический контекст, вы можете указать его самостоятельно, используя механизм самостоятельного deriving.