Mehrere Typparameter in der Typklasse?

8

Nehmen wir an, ich habe eine Typklasse Stack mit einer Instanz List :

%Vor%

Wie Stack muss definiert werden, damit List nicht auf Integer Werte beschränkt ist?

%Vor%     
Cubinator73 18.09.2015, 16:26
quelle

2 Antworten

6

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:

%Vor%

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.

    
Willem Van Onsem 18.09.2015, 16:31
quelle
8

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 * ):

%Vor%

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.

    
Daniel Wagner 18.09.2015 16:48
quelle

Tags und Links