Nehmen wir an, ich habe eine Typklasse Stack
mit einer Instanz List
:
Wie Stack
muss definiert werden, damit List
nicht auf Integer
Werte beschränkt ist?
In diesem Fall können Sie eine Multiparameter-Klasse erstellen:
%Vor%und definieren Sie es mit:
%Vor% Beachten Sie, dass dies keine standardmäßige Haskell-Funktion ist und dass Sie sie aktivieren müssen. Entweder indem Sie -XMultiParamTypeClasses
und -XFlexibleInstances
an den Compiler übergeben.
Oder Sie können schreiben:
%Vor%in der Kopfzeile Ihrer Quelldatei.
Beachten Sie, dass es mehrere b
für ein a
geben kann, für die Sie eine Instanz definieren (und umgekehrt). Dies kann die Arbeit mit solchen Klassen erschweren. Sagen Sie zum Beispiel, Sie schreiben einen Dummy
type:
Sie können definieren:
%Vor% Nun bedeutet das, dass Sie Stack
instance für jede mögliche b
haben, so dass Sie push
und pop
alle Arten von Zeugs auf Dummy
Objekte setzen können.
Erwägen Sie die Verwendung einer Klassenvariablen höherer Klasse. Also:
%Vor% Die Instanz bleibt genau so, wie Sie sie geschrieben haben (obwohl List
jetzt hat * -> *
anstelle von *
):
Dieser Ansatz ist reine Haskell 2010 - es erfordert keine Erweiterungen.
Überlegen Sie auch, ob Sie Ihre Fehler beobachten können; zum Beispiel durch Ändern des Typs von pop
und last
, um Maybe (s a)
bzw. Maybe a
zurückzugeben.