Предположим, у меня есть это семейство типов, которое выдает ошибку нестандартного типа во время компиляции, если переданный ему тип не является записью:
type family IsRecord (a :: Type) where
...
Теперь у меня есть этот класс типов, который имеет методы с реализациями по умолчанию, но требует, чтобы тип был записью, добавив ограничение IsRecord
:
class IsRecord a => Foo a where
foo :: Text
foo = "foo"
При попытке использовать его неправильно, если мы используем его как обычный экземпляр с типом, который не является записью, он успешно не компилируется:
data Bar = Bar
instance Foo Bar -- error: Bar is not a record
Но если я включу -XDeriveAnyClass
и добавлю его в производное предложение, его не скомпилируют, полностью игнорируя ограничение:
data Bar = Bar
deriving (Foo)
Я понимаю, что DeriveAnyClass
генерирует пустое объявление экземпляра, что я и делаю в первом примере, но все равно оно не выдает ошибку. Что происходит?
Я использую GHC 8.6.4