В 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 этого не делает.
Functor
. То же самое сMonoid
. - person augustss   schedule 23.06.2012