Haskell:
De lengte van een string vinden
Hoe te:
-- Gebruik makend van de `length` functie
main = do
let myString = "Hallo, Haskell!"
print $ length myString
Voorbeelduitvoer:
15
Diepere Duik
Haskell is een puur functionele taal waar strings worden weergegeven als lijsten van karakters. De length
functie, onderdeel van de Prelude (de standaardbibliotheek die in elk Haskell-programma wordt geïmporteerd), werkt onder deze weergave.
Historisch gezien waren strings als lijsten een natuurlijke keuze voor Haskell vanwege hun eenvoud en het feit dat Lisp een vergelijkbare ontwerpkeuze maakte (en veel functionele talen beïnvloedde). De length
functie telt gewoon de elementen in deze lijst.
Echter, length
is O(n), wat betekent dat de functie tijd zal nemen die evenredig is aan de lengte van de string. Dit is geen probleem voor korte strings, maar voor lange kan het inefficiënt zijn.
Alternatieven zijn onder andere:
- Gebruik maken van
Text
uit hettext
pakket, een efficiëntere structuur voor Unicode-tekst. - Gebruik maken van
ByteString
uit hetbytestring
pakket voor binaire of ASCII-gegevens.
Beiden bieden een length
functie geoptimaliseerd voor hun respectieve datastructuren.
Wat betreft de implementatie kan een basisversie van de length
functie er zo uitzien:
myLength :: [a] -> Int
myLength [] = 0 -- De lengte van een lege lijst is 0
myLength (_:xs) = 1 + myLength xs -- Recursief 1 optellen voor de rest van de lijst
Voor Text
en ByteString
gegevenstypes hebben ze hun eigen interne implementatiedetails die ze efficiënter maken dan een simpele gelinkte lijst van karakters.