GHC有一些语言标志,如DeriveFunctor、DeriveDataTypeable等,它们允许编译器为Haskell98中允许的类型类以外的类型类生成派生实例。这对于Functor这样的东西尤其有意义,因为该类的规则规定了一个明显的、“自然”的派生实例。
那么,为什么Monoid不能呢?它似乎适用于任何只有一个数据构造函数的数据类型:
data T = MkT a b c ...
可以机械地生成一个Monoid实例(请原谅伪代码):
instance (Monoid a, Monoid b, Monoid c, ...) => Monoid T where
mempty =