mehrere Typparameter in Haskell-Typklassen

8

Ich versuche Abstraktion in Haskell98 zu machen, weiß aber nicht, wie ich es machen soll.

Was ich tun möchte, ist eine Klasse für Typen zu definieren, die in Listen umgewandelt werden können.

%Vor%

Aber ich weiß nicht, wie man eine Klasse für diese Methode definiert. Ich habe die folgenden drei Ideen aufgegriffen:

%Vor%

Der erste funktioniert nicht, weil Haskell98 mehrere Parameterklassen nicht zulässt.

Der zweite funktioniert nicht, weil b von a abhängt und nicht für jeden b implementiert werden kann.

Der dritte funktioniert auch nicht, weil ich nicht weiß, wie man die Klasse mit einem Typ instanziiert, wobei 'b' nicht der letzte Typparameter ist.

%Vor%

oder

%Vor%

Wie würde ich so etwas machen?

    
Thomas Danecker 21.11.2008, 15:46
quelle

3 Antworten

8

Siehe auch Data.Foldable in der Standardbibliothek , die eine toList -Funktion für jede Foldable -Instanz bereitstellt. Foldable benötigt ein wenig Raffinesse, um instanziiert zu werden, aber es wäre eine gute Übung. Als Bonus ist Ihr HTree type fast genau der selbe wie in der Beispielinstanz in der Dokumentation.

Außerdem empfehle ich, Ihre HTree zu ändern:

%Vor%

Und dann HTree (a,b) anstelle von HTree a b verwenden. Diese Single-Parameter-Version lässt sich einfacher mit Standardtypen und -instanzen kombinieren und bringt mehr auf den Punkt, da sie von beiden Parametern auf die gleiche Weise abhängt. Es ist auch ein Functor , und die Definition einer solchen Instanz wird diesen Typ wirklich angenehm machen.

    
luqui 23.11.2008, 07:11
quelle
4

Ich würde empfehlen Typklassen sind nicht so nützlich wie sie zuerst scheinen - Wenn die putative Klasse nur eine Schnittstellenmethode hat, sollten Sie stattdessen einen Funktionstyp deklarieren. Ich kam auch aus einem OO-Hintergrund und fand heraus, dass ich viel zu viel Zeit damit verbracht habe zu versuchen, "Klasse" zu meinen, was ich dachte, wenn es wirklich "Daten" hätte verwenden sollen.

Es ist viel einfacher, einfach Ihre toList-Funktion zu schreiben und sie dann zu "heben", um Ihre Datenstruktur zu bearbeiten. Das gefeierte Yet Another Haskell Tutorial durchläuft eine umfangreiche Übung, die zeigt, wie es gemacht wird. und verwendet einen binären Baum als Beispiel. Das Tolle an einem Lift ist, dass er unterscheidet, was wichtig ist - die Struktur des Datentyps, nicht die Implementierung von toList "- sobald also der Lift ausgeführt wird, um den Datentyp zu durchlaufen, können Sie den Lift verwenden alles tun - toList, drucken, was auch immer. Das Unterstützen von toList ist nicht der wichtige Teil der Datenstruktur, daher sollte es nicht in einer Klassendeklaration sein - der wichtige Teil ist, wie man die Datenstruktur durchläuft.

    
Chris 21.11.2008 21:10
quelle
-1

Sie möchten wahrscheinlich die letzte Option für die Klasse ToList auswählen und (HTree a) instance von ToList machen. Dann hat toList den Typ (HTree a b) -> [b] , nicht zum Beispiel (HTree a b) -> [(a,b)] . Ich nehme an, Sie denken an einen "Schlüssel" und einen "Wert" -Typ.

%Vor%     
mattiast 22.11.2008 11:27
quelle

Tags und Links