2014-04-27 7 views
9

Kann in Haskell ein Datentyp innerhalb eines Funktionsumfangs definiert werden?Haskell: Definieren eines neuen Datentyps mit Funktionsumfang

Zum Beispiel schreibe ich eine Funktion f :: [(Char, Int)] -> [(Char, String)]. In der Implementierung der Funktion baue ich einen Baum aus der Eingabeliste und durchquere dann den Baum, um die Ausgabeliste zu erstellen. Eine Lösung besteht darin, einen neuen Baum-Datentyp zu definieren, der für mein Problem spezifisch ist, zusammen mit zwei Hilfsfunktionen, von denen eine die Eingangsliste in den Baum übersetzt und die andere den Baum durchläuft und die Ausgabeliste erstellt.

Jetzt können die beiden Hilfsfunktionen leicht in den Gültigkeitsbereich f gezogen werden, indem sie in eine where-Klausel eingefügt werden, aber was ist mit dem vorläufigen Nonce-Typ Tree? Es scheint hässlich zu sein, den Namensraum zu verschmutzen, indem ich ihn außerhalb des Funktionsbereichs definiere, aber ich weiß nicht, wie ich das sonst tun soll.

Für Kontext, stellt sich heraus, ich bin eine Huffman-Codierung berechnen. Ich bin nicht besonders daran interessiert, zu diesem Zeitpunkt einen alternativen Algorithmus zu finden, da ich vermute, dass es in Haskell oft nützlich sein wird, Hilfsdatentypen zwischen Hilfsfunktionen zu definieren, weshalb ich an allgemeinen Ansätzen interessiert bin.

+12

Alle Datentypen-Deklarationen müssen auf der obersten Ebene sein. Wenn Sie den Namespace nicht verschmutzen möchten, exportieren Sie den Datentyp nicht. – user2407038

+0

[Dies] (http://stackoverflow.com/questions/15320391/proposal-for-local-data-declarations-instances) möglicherweise relevant. – is7s

Antwort

6

Nein, es ist unmöglich.

In Haskell Module und qualifizierte Importe sollen alle Namespacing Probleme lösen, wie Ihre oder die berüchtigte Datensatznamen Kollision.

Sie möchten also, dass ein Typ nur für eine bestimmte Funktion sichtbar ist? Setzen Sie diesen Typ und diese Funktion in ein neues Modul und exportieren Sie (optional) nur die Funktion.

Sicher, durch die Einhaltung dieser Konvention werden Sie mit mehr Modulen als üblich enden, aber wenn Sie darüber nachdenken, ist dies nicht wirklich anders als viele andere Sprachen. Z. B. ist es in Java üblich, jede Klasse in eine separate Datei zu setzen, egal wie klein die Klasse ist.

Ich muss jedoch erwähnen, dass weit weg von den meisten Menschen in der Gemeinschaft tatsächlich diese Konvention folgen. Sie können oft kryptische Namen sehen, um dies zu umgehen. Ich persönlich finde einen solchen Ansatz nicht sehr sauber und würde eher die Verwendung von Modulen empfehlen.

Verwandte Themen