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.