A Haskellben a Unicode (3.0) karakterkészlet használható, a nyelv korábbi változatai az ASCII karaktereket használták. A kis- és nagybetűket a fordító megkülönbözteti.
A Haskell fordító előfeldolgozója a nem Unicode karaktereket Unicode-ra konvertálja és az \uhhhh escape szekvenciát használja (a "h" itt hexadecimális számjegyet takar), a különleges karakterek esetén.
A továbbiakban a következő BNFszerű szabályokat használjuk ott, ahol a specifikációból idézünk:
Példa indentált módra:
ugyanez nem indentált módban:
vagy éppen összevissza:
Az azonosítók betűvel kezdődnek és betűkkel, számjegyekkel, aláhúzásokkal vagy aposztrófokkal (') folytatódhatnak. Az első betű alapján az azonosítókat két osztályba soroljuk: * a kisbetűvel kezdődő azonosítók változó azonosítók, például name és naMe (a kis- és nagybetűk megkülönböztetettek, ez két különböző azonosító); * a nagybetűvel kezdődő azonosítók pedig konstruktor azonosítók (Pl: Name). Az aláhúzás (_) kisbetűnek számít, de önmagában állva fenntartott szó. Némely fordítóprogram figyelmeztet ha nem használt azonosítókat talál, ilyenkor a figyelmeztetést elnyomhatjuk, ha _-vel kezdjük az adott azonosítót. Mind a változó, mind a konstruktor azonosítók lehetnek kvalifikáltak. A kvalifikáció itt azt jelenti, hogy a lexikális elem elé írjuk ("."-al elválasztva) a modul nevét.
Numerikus literálok A numerikus literálok lehetnek egész számok (integer) és lebegőpontos számok (float) 1. Az egész számot tartalmazó literálokat háromféleképpen lehet megadni:
Decimális alakban:
Oktális alakban (0o vagy 0O prefixszel):
Hexadecimális alakban (0x vagy 0X prefix):
2. A lebegőpontos számot tartalmazó literálok mindig decimálisak. Az ezekre vonatkozó lexikális szabály:
Például:
Karakter és sztring literálok
A karaktereket egyszerű idézőjelek közé írjuk.
A sztring literál tulajdonképpen egy rövidítés karakterek listájára. A sztringeket kettős idézőjelek közé írjuk:
A karakteres literálokban használható escape sorozatok táblázata:
Excape jelsorozat | Jelentés |
---|---|
\[decimális szám] | a decimális számnak megfelelő karakter |
\x[hexadecimális szám] | a hexadecimális számnak megfelelő karakter |
\o[oktális szám] | az oktális számnak megfelelő karakter |
\a | hangjelzés (alert) |
\b | törlés (backspace)< |
\f | form feed |
\n | új sor (new line)< |
\r | kocsivissza (carriage return) |
\t | tabulátor (horizontal tab)< |
\v | függőleges tabulátor (vertical tab) |
\\ | \< |
\" | " |
\' | '< |
\& | ez az ún. nullkarakter, nincsen hatása, arra jó, hogy lehessen ilyet írni: "\137\&9", ami a 137-es kódú karakterből és a 9-esből álló karakterlánc |
\^[ASCII nagybetű] | az adott betű és a ctrl együttes lenyomásának felel meg< |
\^@ | |
\^[ | |
\^] | |
\^\ | |
\^^ | |
\^_ | |
\NUL | \x00=NULL |
\SOH | \x01=START OF HEADING |
\STX | \x02=START OF TEXT |
\ETX | \x03=END OF TEXT |
\EOT | \x04=END OF TRANSMISSION |
\ENQ | \x05=ENQUIRY |
\ACK | \x06=ACKNOWLEDGE |
\BEL | \x07=BELL |
\BS | \x08=BACKSPACE |
\HT | \x09=CHARACTER TABULATION |
\LF | \x0A=LINE FEED |
\VT | \x0B=LINE TABULATION |
\FF | \x0C=FORM FEED |
\CR | \x0D=CARRIAGE RETURN |
\SO | \x0E=SHIFT OUT |
\SI | \x0F=SHIFT IN |
\DEL | \x10=DATALINK ESCAPE |
\DC1 | \x11=DEVICE CONTROL ONE |
\DC2 | \x12=DEVICE CONTROL TWO |
\DC3 | \x13=DEVICE CONTROL THREE |
\DC4 | \x14=DEVICE CONTROL FOUR |
\NAK | \x15=NEGATIVE ACKNOWLEDGE |
\SYN | \x16=SYNCHRONOUS IDLE |
\ETB | \x17=END OF TRANSMISSION BLOCK |
\CAN | \x18=CANCEL |
\EM | \x19=END OF MEDIUM |
\SUB | \x1A=SUBSTITUTE |
\ESC | \x1B=ESCAPE |
\FS | \x1C=FILE SEPARATOR |
\GS | \x1D=GROUP SEPARATOR |
\RS | \x1E=RECORD SEPARATOR |
\US | \x1F=UNIT SEPARATOR |
\SP | \x20=SPACE |
\DEL | \x7F=DELETE |
Fenntartott karaktersorozatok
Fenntartott operátorok:
Fenntartott azonosítók: case, class, data, default, deriving, do, else, if, import, in, infix, infixl, infixr, instance, let, module, newtype, of, then, type, where, _
Tipus lekerdezese:
Egy adott kifejezésnek vagy változónak a típusát meg tudjuk, ha a :t
A megjegyzések whitespace tokennek minősülnek. A -- jelek után a sor végéig, vagy {- és -} jelek között több soron keresztül tartó megjegyzést írhatunk, az utóbbi változat egymásba is ágyazható. Külön dokumentációs megjegyzés nincs, ugyanakkor érdekesség, hogy a "-->" és a "--|" nem komment, ugyanis a lexikális elemző a leghosszabb illeszkedés szabálya alapján dolgozik, és van más '--'-vel kezdődő lexikális elem is (ez a két jel akár egy-egy operátornév is lehetne). Megemlítendő még az ún. literate forrás, amikor minden sor megjegyzés, kivéve a ">"-al kezdődőeket. Ez didaktikai szempontból kényelmes - ami, ne felejtsük el, egyik célkitűzése volt a programnyelvnek.