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) ...
Я знаю, что derive пакет предоставляет это, но мой вопрос конкретно заключается в том, есть причина, почему GHC не делает.