In Haskell zijn er een aantal interessante dingen aan de hand omtrent nummers. Zo kunnen operators (+,-,/,*) opgeschreven worden via een infix vorm (2+3) of een prefix vorm ((+) 2 3). Dit geeft aan dat zelfs de operators functies zijn.
Een ander interessant feit aan nummers is hoe of omgegaan wordt met falsy-values. True en false zijn namelijk, anders dan in JavaScript, geen nummers. Wanneer er True met 1 wordt vergeleken, wordt er een keiharde compiler error gegooid. De types van True en 1 zijn namelijk niet gelijk. Dit is zowel een kracht als voor sommigen een nadeel. Er moet nu een conversie gedaan worden van de waarde True. Dit is meer werk, maar tegelijkertijd zorgt dit er ook voor dat de applicatie correcter is.
De operators voor het vergelijken van waardes zijn grotendeels hetzelfde als in Java en C#. Een enkeling wijkt af. Zo gebruik je in C# x != y, terwijl je in haskell x /= y gebruikt. Daarnaast kunnen we in C# negation toepassen voor bijvoorbeeld het flippen van een boolean. In C# doen we dit door x = !y. In Haskell doen we dit door x = not y. Voor beide manieren is wat te zeggen, maar uiteindelijk is het een kwestie van wennen.
Operators hebben in Haskell een prioriteit, vergelijkbaar met de wiskunde. Zo geeft 25 + 10 * 2 hetzelfde resultaat als 10 * 2 + 25 van 45. In de onderstaande afbeeldingen zien we dit ook terugkomen. ‘+’ heeft een prioriteit van 6 (gelijk aan prioriteit van ‘-‘), terwijl ‘*’ een prioriteit heeft van 7.

Wat in de afbeeldingen ook te zien is, is of de operators ‘left’ of ‘right’ associative zijn. We zien door de ‘infixl’ of ‘infixr’ welke dit is. Wanneer een operator right associative is, wordt een expressie van rechts naar links berekend wanneer deze operator vaker achter elkaar voorkomt.
Het ding waar ik erg enthousiast over ben: lijsten. In Elm heb ik gezien dat er veel gave dingen mogelijk zijn op het gebied van lijsten. Met name pattern matching kan erg handig zijn. Ik zie dat lijsten in Haskell simpel aangemaakt kunnen worden door dit in array-vorm te noteren. Ook zie ik dat Haskell een lijst van nummers het type Num a => [a] geeft. Een lijst van strings heeft het type [[Char]]. Apart dat de lijst met nummers een functie definitie is en de string lijst dit niet is. Daarnaast valt het op dat de string lijst een lijst van Char-lijsten is. Ik zie ook dat een enkele string simpelweg een Char-lijst is.

Lijsten moeten van 1 specifiek type zijn. Het is niet mogelijk om zowel nummers als strings in een lijst te stoppen.

Ook is het gemakkelijk om even snel een lijst van nummers aan te maken door te noteren: x = [1..5]. Dit geeft de lijst [1,2,3,4,5]. Dit kan ook gecombineerd worden met een aantal andere waardes. Bijvoorbeeld x = [14,34,3..7]. Dit geeft de lijst [14,34,3,4,5,6,7].
Wat opvalt aan het type systeem is dat Haskell types niet impliciet convert naar een ander type, zoals het converteren van int naar een float. In talen als C# wordt dit automatisch gedaan. In Haskell wordt er een harde compiler error gegooid. Dit kost meer werk, maar garandeert dat er geen type errors voor kunnen komen. Het feit dat Haskell compile-time al weet wat alle types zijn, geeft aan dat Haskell een static type system heeft.