in Haskell haben wir drei Art und Weise neue Art zu definieren, indem drei verschiedene Schlüsselwörter, Typ, newtype und Daten.
useE :: E -> String
useE A = "This is A"
useE B = "This is B"
Jetzt eine komplexere Datendeklaration aus Ihrem Code.
data Q = Q0 | Q1 | Q2 deriving (Eq, Enum, Bounded)
Wiederum, wie zuvor gesagt, haben wir ein sum Typ, die einen neuen Typ Q definieren, aufgenommen mit drei Werten, Q0, Q1 oder Q2. Aber wir haben eine Ableitungsklausel, die dem Compiler sagen, dass dieser neue Typ die Methode (oder Funktion) implementiert, die von Eq, Enum, Bounded Klasse abgeleitet (oder geerbt) wird. Was bedeutet das?
Werfen wir einen Blick auf eine Funktion.
Stellen Sie sich vor, Sie möchten jedem Wert von Q eine Zahl zuordnen, wie können wir das ausführen?
enumQ :: Q -> Int
enumQ x = fromEnum x
Wenn Sie mehr Einblick über diese besondere Funktionalität von bieten Ableiten Klausel, lesen Sie die Ressourcen, die angegeben wurden, und versuchen : info Enum unter GHCI. Beachten Sie, dass der vorherige Typ auch von derselben Klasse abgeleitet werden kann. Da diese Typen vollständig als die Summe eines aufzählbaren Wertes beschrieben werden (diskriminiert durch |), verstehen wir besser, warum wir sie Sum-Typ nennen.
Endlich die schwierigste Datendeklaration.
data DFA q o = DFA (q -> o -> q) q [q]
data NFA q o = NFA (q -> o -> [q]) [q] [q]
Wenn Tatsache, dass sie fast die gleiche Datendefinition ist, dann werde ich gehen, um die ersten Trog und Ihnen die Analysen des zweiten als Übung lassen.
data DFA q o = DFA (q -> o -> q) q [q]
Dieses Mal müssen wir über Daten Konstruktor und Typkonstruktor sprechen.
- Auf der linken Seite der Gleichung gibt es Daten Konstruktor, gebaut Daten und ihm einen Namen geben. Auf dieser Seite haben wir den erforderlichen Parameter, um diese neuen Daten zu erstellen.
- Auf der rechten Seite der Gleichheit, gibt es Typ Konstruktor, um diesen neuen Typ gebaut. Auf dieser Seite haben wir die explizite Klempner, die dem Leser zeigen, wie dieser neue Typ (Daten) mit dem vorhandenen Typ gebaut wird.
Jetzt im Auge behalten, dass die folgende Art sind,
- [x] ::: Typ der polymorphen Liste darstellt, Beispiel, [Int] => Liste der Int
- x ::: ein Grundtyp, einer der bestehenden (Int, Char, String ...)
- x -> y ::: Art, die eine Funktion eines Typs x entnommen definieren prod uce a Typ y.
- x -> y -> z ::: Geben Sie einen Typ x und einen Typ y ein, um einen Typ z zu erzeugen. Das kann als eine Funktion betrachtet werden, die eine andere Funktion vom Typ (x-> y) nimmt und einen Typ z erzeugt. Dies nennen wir eine High-Order-Funktion.
Dann sind unsere Datendeklaration in diesem Zusammenhang stellen, ein Daten Konstruktor ist, Futtermittel durch zwei Typparameter, q und o und als Ergebnis ist es, einen neuen Typ als das Produkt zurückgeben Eine höherwertige Funktion ist ein Basistyp und ein Listentyp. Was erklären, warum wir dies eine Produktart nennen.
Es sollte genug sein, jetzt, abschließend selbst, um Ihre Frage zu beantworten, was macht n1?
Viel Glück.
[Lernen Sie ein Haskell für sehr gut] (http://learnyouahaskell.com/) ist wahrscheinlich ein guter Anfang. Sie müssen in der Lage sein, mindestens grundlegende Haskell-Typ-Signaturen zu lesen und zu verstehen, um Fortschritte bei der Zuweisung zu erzielen. – shang
Zweitens können Sie die Wikipedia-Artikel zu [DFAs] (http://en.wikipedia.org/wiki/Deterministic_finite_automaton) und [NFAs] (http://en.wikipedia.org/wiki/Nondeterministic_finite_automata) lesen. – shang