Haskell - Grunddatenmodelle
Haskell ist eine rein funktionale Programmiersprache und daher viel interaktiver und intelligenter als andere Programmiersprachen. In diesem Kapitel lernen wir grundlegende Datenmodelle von Haskell kennen, die tatsächlich vordefiniert oder irgendwie intelligent in den Computerspeicher dekodiert sind.
In diesem Tutorial verwenden wir die Haskell-Online-Plattform, die auf unserer Website verfügbar ist (https://www.tutorialspoint.com/codingground.htm).
Zahlen
Haskell ist intelligent genug, um eine Zahl als Zahl zu dekodieren. Daher müssen Sie den Typ nicht extern erwähnen, wie wir es normalerweise bei anderen Programmiersprachen tun. Gehen Sie beispielsweise zu Ihrer Vorspiel-Eingabeaufforderung und führen Sie einfach "2 + 2" aus und drücken Sie die Eingabetaste.
sh-4.3$ ghci
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> 2+2
Als Ergebnis erhalten Sie die folgende Ausgabe.
4
Im obigen Code haben wir nur zwei Zahlen als Argumente an den GHCI-Compiler übergeben, ohne ihren Typ vordefiniert zu haben, aber der Compiler konnte diese beiden Einträge leicht als Zahlen dekodieren.
Versuchen wir nun eine etwas komplexere mathematische Berechnung und sehen, ob unser intelligenter Compiler uns die richtige Ausgabe liefert oder nicht. Versuchen Sie es mit "15+ (5 * 5) -40"
Prelude> 15+(5*5)-40
Der obige Ausdruck ergibt "0" gemäß der erwarteten Ausgabe.
0
Zeichen
Wie Zahlen kann Haskell ein als Eingabe eingegebenes Zeichen intelligent identifizieren. Gehen Sie zu Ihrer Haskell-Eingabeaufforderung und geben Sie ein beliebiges Zeichen mit doppeltem oder einfachem Anführungszeichen ein.
Lassen Sie uns die folgende Zeile als Eingabe bereitstellen und ihre Ausgabe überprüfen.
Prelude> :t "a"
Es wird die folgende Ausgabe erzeugt -
"a" :: [Char]
Denken Sie daran, Sie verwenden (:t) während der Eingabe. Im obigen Beispiel ist(:t)soll den spezifischen Typ enthalten, der sich auf die Eingaben bezieht. Wir werden in den kommenden Kapiteln mehr über diesen Typ erfahren.
Schauen Sie sich das folgende Beispiel an, in dem wir eine ungültige Eingabe als Zeichen übergeben, was wiederum zu einem Fehler führt.
Prelude> :t a
<interactive>:1:1: Not in scope: 'a'
Prelude> a
<interactive>:4:1: Not in scope: 'a'
Mit der Fehlermeldung "<interaktiv>: 4: 1: Nicht im Gültigkeitsbereich:` a '"warnt uns der Haskell-Compiler, dass er Ihre Eingabe nicht erkennen kann. Haskell ist eine Art Sprache, in der alles mit einer Zahl dargestellt wird.
Haskell folgt dem herkömmlichen ASCII-Codierungsstil. Schauen wir uns das folgende Beispiel an, um mehr zu verstehen -
Prelude> '\97'
'a'
Prelude> '\67'
'C'
Sehen Sie, wie Ihre Eingabe in das ASCII-Format dekodiert wird.
String
EIN stringist nichts als eine Sammlung von Zeichen. Es gibt keine spezifische Syntax für die Verwendung von Zeichenfolgen, aber Haskell folgt dem herkömmlichen Stil der Darstellung einer Zeichenfolge mit doppeltem Anführungszeichen.
Schauen Sie sich das folgende Beispiel an, in dem wir die Zeichenfolge "Tutorialspoint.com" übergeben.
Prelude> :t "tutorialspoint.com"
Es wird die folgende Ausgabe auf dem Bildschirm erzeugt -
"tutorialspoint.com" :: [Char]
Sehen Sie, wie die gesamte Zeichenfolge nur als Array von Char dekodiert wurde. Wechseln wir zum anderen Datentyp und seiner Syntax. Sobald wir mit unserer eigentlichen Praxis beginnen, werden wir uns mit dem gesamten Datentyp und seiner Verwendung vertraut machen.
Boolescher Wert
Der boolesche Datentyp ist ebenso wie andere Datentypen ziemlich einfach. Schauen Sie sich das folgende Beispiel an, in dem wir verschiedene boolesche Operationen mit einigen booleschen Eingaben wie "True" oder "False" verwenden.
Prelude> True && True
True
Prelude> True && False
False
Prelude> True || True
True
Prelude> True || False
True
Im obigen Beispiel müssen wir nicht erwähnen, dass "True" und "False" die Booleschen Werte sind. Haskell selbst kann es dekodieren und die entsprechenden Operationen ausführen. Lassen Sie uns unsere Eingaben mit "true" oder "false" ändern.
Prelude> true
Es wird die folgende Ausgabe erzeugt -
<interactive>:9:1: Not in scope: 'true'
Im obigen Beispiel konnte Haskell nicht zwischen "wahr" und einem Zahlenwert unterscheiden, daher ist unsere Eingabe "wahr" keine Zahl. Daher gibt der Haskell-Compiler einen Fehler aus, der besagt, dass unsere Eingabe nicht der Umfang ist.
Liste und Listenverständnis
Wie andere Datentypen, Listist auch ein sehr nützlicher Datentyp, der in Haskell verwendet wird. Zum Beispiel ist [a, b, c] eine Liste von Zeichen, daher ist List per Definition eine Sammlung desselben Datentyps, die durch Komma getrennt ist.
Wie bei anderen Datentypen müssen Sie eine Liste nicht als Liste deklarieren. Haskell ist intelligent genug, um Ihre Eingabe anhand der im Ausdruck verwendeten Syntax zu dekodieren.
Schauen Sie sich das folgende Beispiel an, das zeigt, wie Haskell eine Liste behandelt.
Prelude> [1,2,3,4,5]
Es wird die folgende Ausgabe erzeugt -
[1,2,3,4,5]
Listen in Haskell sind homogener Natur, was bedeutet, dass Sie keine Liste verschiedener Datentypen deklarieren können. Jede Liste wie [1,2,3,4,5, a, b, c, d, e, f] erzeugt einen Fehler.
Prelude> [1,2,3,4,5,a,b,c,d,e,f]
Dieser Code erzeugt den folgenden Fehler:
<interactive>:17:12: Not in scope: 'a'
<interactive>:17:14: Not in scope: 'b'
<interactive>:17:16: Not in scope: 'c'
<interactive>:17:18: Not in scope: 'd'
<interactive>:17:20: Not in scope: 'e'
<interactive>:17:22: Not in scope: 'f'
Listenverständnis
Listenverständnis ist der Prozess des Erzeugens einer Liste unter Verwendung eines mathematischen Ausdrucks. Schauen Sie sich das folgende Beispiel an, in dem wir eine Liste mit mathematischen Ausdrücken im Format [Ausgabe | "erstellen Reichweite, Zustand].
Prelude> [x*2| x<-[1..10]]
[2,4,6,8,10,12,14,16,18,20]
Prelude> [x*2| x<-[1..5]]
[2,4,6,8,10]
Prelude> [x| x<-[1..5]]
[1,2,3,4,5]
Diese Methode zum Erstellen einer Liste mit mathematischen Ausdrücken wird als bezeichnet List Comprehension.
Tupel
Haskell bietet eine weitere Möglichkeit, mehrere Werte in einem einzigen Datentyp zu deklarieren. Es ist bekannt alsTuple. Ein Tupel kann als Liste betrachtet werden, es gibt jedoch einige technische Unterschiede zwischen einem Tupel und einer Liste.
Ein Tupel ist ein unveränderlicher Datentyp, da wir die Anzahl der Elemente zur Laufzeit nicht ändern können, während eine Liste ein veränderbarer Datentyp ist.
Auf der anderen Seite ist List ein homogener Datentyp, aber Tupel ist heterogener Natur, da ein Tupel möglicherweise einen anderen Datentyp enthält.
Tupel werden durch einzelne Klammern dargestellt. Schauen Sie sich das folgende Beispiel an, um zu sehen, wie Haskell ein Tupel behandelt.
Prelude> (1,1,'a')
Es wird die folgende Ausgabe erzeugt -
(1,1,'a')
Im obigen Beispiel haben wir ein Tupel mit zwei verwendet number Typvariablen und a char Typ Variable.