Gibt es einen Weg (beliebig Weg), Einschränkungen in Typklassen zu implementieren?Gibt es eine Möglichkeit, Einschränkungen in Haskells Typklassen zu implementieren?
Als ein Beispiel von dem, worüber ich rede, angenommen, ich möchte eine Gruppe als eine Typklasse implementieren. So wäre eine Art eine Gruppe sein, wenn es drei Funktionen sind:
class Group a where
product :: a -> a -> a
inverse :: a -> a
identity :: a
Aber das sind keine Funktionen, aber sie müssen durch einige Einschränkungen in Beziehung gesetzt werden. Zum Beispiel:
product a identity = a
product a (inverse a) = identity
inverse identity = identity
etc ...
Gibt es eine Möglichkeit, diese Art von Einschränkung in der Definition der Klasse zu erzwingen, so dass jede Instanz automatisch erben würde? Als Beispiel sei angenommen, würde Ich mag die C2-Gruppe implementieren, definiert durch:
data C2 = E | C
instance Group C2 where
identity = E
inverse C = C
Diese beiden Definitionen eindeutig bestimmt C2 (die obigen Einschränkungen definieren alle möglichen Operationen - in der Tat, C2 die einzig mögliche Gruppe ist mit zwei Elemente wegen der Einschränkungen). Gibt es eine Möglichkeit, dies zum Funktionieren zu bringen?
(Er, 'inverse C = C', sicher?) – dave4420
yep, danke für das Bemerken –
Diese Einschränkungen werden normalerweise * Gesetze * Beispiel, Monad Gesetze genannt. – mb14