Wenn wir eine Typklasse erstellen, gehen wir normalerweise davon aus, dass ihre Funktionen einigen Eigenschaften entsprechen müssen. Daher haben wir die Monoid- und Monad-Gesetze für ihre jeweiligen Typklassen. Aber was ist, wenn es ein Gesetz wie Assoziativität gibt, das ich spezifizieren möchte, dass mehrere Klassen dieses Gesetz befolgen können oder nicht? Gibt es eine Möglichkeit, das in Haskells Typsystem zu tun? Ist diese Art von Typklassen für Typklassen-Idee in der Praxis sogar durchführbar?
Hier ist ein motivierendes Beispiel aus der Algebra:
%Vor%Wenn ich nun angeben möchte, dass der Zusatz über Ints assoziativ und kommutativ ist, kann ich die Klassen und Instanzen erstellen:
%Vor%Aber das ist umständlich, weil ich alle möglichen Kombinationen für alle Klassen erstellen muss. Ich kann nicht einfach assoziative und kommutative Klassen erstellen, denn was ist, wenn Addition kommutativ ist, aber Multiplikation nicht (wie in Matrizen)?
Was ich gerne tun könnte, ist etwas wie:
%Vor%Kann das gemacht werden?
(Haskells abstrakte Algebra-Pakete, wie Algebra und konstruktive Algebra, tun dies derzeit nicht, also rate ich nicht. Aber warum nicht?)
Sie können dies tatsächlich mit einigen aktuellen GHC-Erweiterungen tun:
%Vor%