假设我有这个类型族,如果传递给它的类型不是记录,它会在编译时引发自定义类型错误:
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