len :: [a] -> Int
cnt :: Eq a => a -> [a] -> IntDe specificatie betekent dat cnt werkt voor alle lijsten van objecten [a] die voldoen aan de eis van voor a de gelijkheidsrelatie == is gedefinieerd.
Voorbeeld van een aanroep: cnt 'a' "Jan van Eijck"'. Dit moet 2 opleveren.
vowelCnt:: String -> IntProbeer gebruik te maken van de functie cnt uit de vorige opdracht.
toLower :: Char -> Charzet hoofdletters om in kleine letters, en laat de kleine letters ongemoeid. Deze functie is onderdeel van de Haskell module Char. Die kun je laden in Hugs met behulp van :l Char, of bovenaan je Haskell bestand aanroepen met import Char. Je ziet dan aan de prompt dat de module beschikbaar is.
Gebruik nu toLower om een functie te schrijven die een string omzet in een string zonder hoofdletters.
cntAll :: String -> [(Char,Int)]De letters die niet voorkomen kunnen uit de opsomming van de aantallen worden weggelaten. Een aanroep gaat als volgt:
Main> cntAll "Jan van Eijck" [('a',2),('c',1),('e',1),('i',1),('j',2),('k',1),('n',2),('v',1)]
De type-declaratie voor de functie die we willen implementeren is:
freqChar :: Char -> String -> FloatHierbij is Float het type van getallen met een drijvende comma (Engels: floating point numbers). Om het Float type te krijgen, moet je het Int type eerst omzetten. Dat kan met behulp van de ingebouwde functie fromIntegral. Als n en m van type Int zijn, dan is de uitdrukking fromIntegral n / fromIntegral m van type Float. Deze uitdrukking geeft de waarde van de breuk n/m.
Een voorbeeld-aanroep van de functie:
Main> freqChar 'a' "Jan van Eijck" 0.1818182Nog een voorbeeld: freqChar 'a' "aaabbb" levert 0.5 op.
cntFreqs :: String -> [(Char, Float)]Hier zijn een paar voorbeelden van aanroepen:
Main> cntFreqs "aabbbcccc" [('a',0.2222222),('b',0.3333333),('c',0.4444444)] Main> cntFreqs "Jan van Eijck" [('a',0.1818182),('c',0.09090909),('e',0.09090909),('i',0.09090909),('j',0.1818182),('k',0.09090909),('n',0.1818182),('v',0.09090909)]
NB: vanaf hier zijn de vragen bonusvragen, bedoeld voor wie wil uitblinken.
prefix :: Eq a => [a] -> [a] -> BoolDe aanroep prefix "Ja" "Jan" moet True opleveren.
Schrijf een functie suffixes die de lijst geeft van alle suffixen van een lijst. De type-declaratie:
suffixes :: [a] -> [[a]]De functie levert dus een lijst van lijsten op (de lijst van alle suffixen). De aanroep suffixes "Jan" moet opleveren: ["Jan","an","n",""]. De opsomming van suffixen mag eventueel ook in een andere volgorde.
Schrijf een functie die van twee eindige lijsten nagaat of ze dezelfde verzameling representeren. Het type is:
sameSet :: Eq a => [a] -> [a] -> BoolJe kunt, als je dat wilt, gebruik maken van de voorgedefineerde functies elem en and.
Huiswerk
Tekstbestand met alle antwoorden. Let op: de laatste drie vragen zijn bonusvragen. Deadline: maandag 11 mei, 12 uur 's middags. Per email inleveren bij Arno Bastenhof en Martijn van Steenbergen, met een cc naar Jan van Eijck.