GHC 有一些语言标志,例如等DeriveFunctor
,DeriveDataTypeable
它们允许编译器生成类型类的派生实例,而不是 Haskell 98 中允许的类型。这对于类似的东西特别有意义Functor
,因为该类的法律规定了一个明显的,“自然”派生实例。
那么为什么不Monoid
呢?对于具有单个数据构造函数的任何数据类型来说,似乎是这样的:
data T = MkT a b c ...
可以机械地产生一个Monoid
实例(请原谅伪代码):
instance (Monoid a, Monoid b, Monoid c, ...) => Monoid T where
mempty =
MkT mempty mempty mempty ...
mappend (MkT a1 b1 c1 ...) (MkT a2 b2 c2 ...) =
MkT (mappend a1 a2) (mappend b1 b2) (mappend c1 c2) ...