Angenommen, ich möchte alle Zahlen zu einer Instanz von Monoid
machen. Anstatt für jedes Num
eine Instanz wie folgt erstellen zu müssen:
Gibt es so etwas?
%Vor% Einige antworten mit GHC-Erweiterungen und warnen vor möglichen Problemen. Ich fand das informativ, aber ich denke, ich werde bei Sum
, Product
und was auch immer coerce
tun.
Ich interpretiere das so, als würde ich nach einer allgemeinen Prämisse fragen und nicht speziell nach Monoid
und Num
.
Vielleicht könnten Sie das, was Sie geschrieben haben, zum Laufen bringen, indem Sie die Spracherweiterungen FlexibleInstances, UndecidableInstances und die Verwendung überlappender Instanzen aktivieren.
Aber Sie würden wahrscheinlich nicht wollen: es scheint wie instance Num t => Monoid t where ...
sagt
"Wenn t
eine Instanz von Num
ist, können Sie wie folgt t
eine Instanz von Monoid
..."
Leider stimmt das nicht. Was es eigentlich sagt, ist mehr wie
"So erstellen Sie t
eine Instanz von Monoid.
Zuerst muss t
eine Instanz von Num
sein. Weiter ..."
Wenn Sie also eine Instanzdeklaration schreiben, können Sie keine anderen Instanzdeklarationen schreiben. (Zumindest nicht ohne OverlappingInstances
, das würde seine eigenen Probleme bringen.)
GHC ermöglicht Ihre Definition mit einigen aktivierten Spracherweiterungen
%Vor% Dies macht 2 <> 3
Ergebnis in 5
.
Aber Dies überschneidet sich mit anderen Monoid
-Instanzen und versucht daher, "Hello" <> "World"
-Ergebnisse mit einem Fehler zu bewerten: Overlapping instances for Monoid [Char]
Also, ich denke, dass die kurze Antwort lautet: Nein.
Tags und Links haskell typeclass type-constraints