GHC hat einige Sprachflags, wie DeriveFunctor
, DeriveDataTypeable
usw., die die Compilergenerierung abgeleiteter Instanzen für andere Typklassen als die in Haskell 98 erlaubten ermöglichen. Dies macht insbesondere für Functor
Sinn, wo die Gesetze dieser Klasse diktieren eine offensichtliche, "natürliche" abgeleitete Instanz.Warum kann GHC keine Instanzen für Monoid ableiten?
Also warum nicht für Monoid
? Es scheint, wie für jeden Datentyp mit einem einzigen Datum Konstruktor:
data T = MkT a b c ...
man könnte eine Monoid
Instanz mechanisch erzeugt (entschuldigen Sie den Pseudo-Code):
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) ...
Ich bin mir bewusst, dass das Paket deriveprovides this, aber meine Frage ist speziell, ob es einen Grund gibt, warum GHC das nicht tut.
@sdcvvc: Dies scheint wie eine gültige Antwort auf die Frage. Vielleicht sollten Sie es als solches posten? –
OK, ich habe eine Antwort gegeben. – sdcvvc
Es gibt normalerweise nur eine vernünftige Möglichkeit, eine 'Functor'-Instanz zu erstellen. Das Gleiche gilt nicht für "Monoid". – augustss