Vowel Datentyp in Haskell, ist das möglich?

7

Ich habe den folgenden Code geschrieben, um Vokale aus einem Satz zu entfernen:

%Vor%

Ich frage mich nur, ob es möglich ist, einen Datentyp für Vokal zu erstellen? Der Compiler lässt mich keine Zeichen in einem Datentyp verwenden.

    
Richard Mosse 01.10.2011, 23:36
quelle

2 Antworten

15

Nicht direkt. Das Problem besteht darin, dass Zeichen ein eingebauter Typ ohne Polymorphismus sind. Dies unterscheidet sich von numerischen Literalen, die über die Klasse Num typic polymorph sind.

Es gibt zwei grundlegende Ansätze, die Sie verwenden können: einen Wrapper des Typs newtype mit einem intelligenten Konstruktor oder einen völlig neuen Typ.

Der Wrapper des neuen Typs ist einfacher zu verwenden:

%Vor%

Da der Konstruktor Vowel nicht exportiert wird, kann new Vowel s nur von der Funktion vowel erstellt werden, die nur die gewünschten Zeichen zulässt.

Sie könnten auch einen neuen Typ wie folgt erstellen:

%Vor%

Dieser zweite Weg ist ziemlich schwer und daher viel schwieriger zu benutzen.

So geht das. Ich bin mir nicht ganz sicher, ob du das willst. Das übliche Idiom besteht darin, Typen zu erstellen, die Ihre Daten repräsentieren, und Sie stellen nicht für Vokale. Ein gängiges Muster wäre etwa so:

%Vor%

Hier unterscheidet der neue Typ zwischen unsanitisierter und sanierter Eingabe. Wenn die CleanString nur durch cleanString erstellt werden kann, dann wissen Sie statisch, dass jedes CleanString ordnungsgemäß bereinigt ist (vorausgesetzt, dass cleanString korrekt ist). In deinem Fall scheint es, dass du einen Typ für Konsonanten brauchst, keine Vokale.

Newtypes in Haskell sind sehr leicht *, aber der Programmierer muss Code schreiben und verwenden, um das Wrapping und das Unwrapping durchzuführen. In vielen Fällen überwiegen die Vorteile die zusätzliche Arbeit. Aber ich kann mir wirklich keine Anwendung vorstellen, bei der es wichtig ist zu wissen, dass% code% vokalfrei ist, also würde ich wahrscheinlich nur mit einer einfachen String arbeiten.

* newtypes existieren nur zur Kompilierzeit, daher gibt es in der Theorie keine Laufzeitkosten für die Verwendung. Ihre Existenz kann jedoch den erzeugten Code ändern (z. B. das Sperren von RULEs), so dass manchmal ein messbarer Leistungseinfluss auftritt.

    
John L 02.10.2011, 00:54
quelle
8

Sie können Phantom-Typen verwenden, um Zeichen mit zusätzlichen Informationen zu versehen, damit das Typsystem während der Kompilierung garantiert ist dass Ihre Strings nur Vokale oder Nicht-Vokale enthalten.

Hier ist ein Spielzeugbeispiel:

%Vor%

Der Vorteil dieses Ansatzes ist, dass Sie auch Funktionen schreiben können, die unabhängig vom Tag auf allen TaggedChars funktionieren. Zum Beispiel:

%Vor%     
shang 02.10.2011 08:08
quelle