We gaan ervan uit dat het gelukt is het Haskell platform te installeren op je laptop. Start ghci met behulp van het commando ghci
.
Je ziet nu iets dat lijkt op het volgende:
[jve@dukat masterclass]$ ghci
GHCi, version 7.8.4: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude>
Probeer nu eerst Haskell uit als rekenmachine. Hoeveel is 2^3^4
? Wordt dit door de interpreter gelezen als (2^3)^4
of als 2^(3^4)
?
Bereken hoeveel seconden er in een schrikkeljaar gaan. Een schrikkeljaar heeft 366 dagen.
Verlaat nu de ghci
interpreter met behulp van control-d
(de control toets ingedrukt houden en een d
intypen), of met behulp van :q
.
Maak een tekstbestand aan met de titel kwadraat.hs
en zorg dat er het volgende in staat:
kwdr :: Integer -> Integer
kwdr x = x * x
Gebruik hiervoor je favoriete editor. Sla het bestand op en sluit de editor af. Blijf in hetzelfde directory (dezelfde map) waar kwadraat.hs
zich bevindt, en start ghci
opnieuw op met behulp van het commando ghci kwadraat.hs
, gevolgd door return. Je komt nu opnieuw in het systeem, maar dit keer is de prompt niet Prelude>
maar *Main>
. Dit geeft aan dat er een eigen bestand is geladen. Probeer de definitie uit:
*Main> kwdr 7
Bereken vervolgens:
*Main> kwdr (kwdr (kwdr (kwdr 7)))
VLFP.hs
, dat je vantevoren hebt opgehaald van internet (het staat hier). Dit bestand bevat alle voorbeeldprogramma's uit de college-slides. Probeer de definities uit de slides uit: *Main> kwadraat 7
*Main> drievoud 7
*Main> awoord "zeven"
Ga na of kwadraat
zich op dezelfde manier gedraagt als de functie kwdr
uit de vorige opdracht. Zo nee, wat is het verschil?
Probeer primes
en primes'
met elkaar te vergelijken. Welke van de twee genereert de reeks van priemgetallen sneller? Maakt het veel uit? Om de oneindige reeksontwikkeling na een tijd af te sluiten kun je control-c
gebruiken.
Gebruik nu de editor om het bestand VLFP.hs
aan te vullen met een eigen definitie van bwoord
, voor tekenrijtjes die de letter b
bevatten. Laad de nieuwe versie, en probeer uit.
Implementeer een functie nextPrime :: Integer -> Integer
met de eigenschap dat nextPrime n
gelijk is aan n
als n
een priemgetal is, en anders aan het eerste priemgetal dat op n
volgt.
Als je tot hier gekomen bent ben je toe aan de extra opdrachten uit de cursus slides. Je kunt de nieuwe functies waarnaar gevraagd wordt toevoegen aan het bestand VLFP.hs
, het bestand vervolgens herladen in ghci
met behulp van :reload
, en de functies uitproberen. Maak zoveel mogelijk gebruik van de voorbeeldfuncties die al in VLFP.hs
staan.
Beschouw het programma dat we in de lezing hebben gezien:
mersenne :: [(Integer,Integer)]
mersenne = [ (p,2^p -1) | p <- primes',
prime' (2^p - 1) ]
Wat is het grootste Mersenne priemgetal dat je met deze functie kunt vinden?
Een priempaar is een paar (p, p + 2) van natuurlijke getallen met de eigenschap dat p en p + 2 allebei priemgetallen zijn. Kun je een functie schrijven die priemparen genereert?
Een priem-drietal is een drietal (p, p + 2, p + 4), met p, p + 2, p + 4 alledrie priem. Het eerste priem drietal is (3, 5, 7). Het eerste priem drietal is (3, 5, 7). Bestaan er nog meer? Waarom wel/niet? Kun je ze genereren met de computer?
Een andere definitie van een priem-drietal is een drietal (p, q, r) met de eigenschap dat p, q, r opeeenvolgende priemgetallen zijn zodanig dat r − p = 6. Het eerste priem-drietal volgens deze definitie is (5, 7, 11). Zijn er nog meer? Waarom wel/niet? Kun je ze genereren met een computer?
Schrijf een Haskell programma dat kan worden gebruikt om de volgende bewering over priemgetallen te weerleggen. Als p1, …, pk alle priemgetallen zijn die kleiner zijn dan n, dan is (p1 × ⋯ × pk)+1 eeen priemgetal. Je weerlegt dit vermoeden door een tegenvoorbeeld te geven. Schrijf een Haskell programma dat tegenvoorbeelden genereert.
Als een metselaar of timmerman een rechte hoek moet uitzetten, bij voorbeeld voor het leggen van een fundering, maakt hij (of zij) een zogenaamde `drie, vier, vijf steek': een driehoek met zijden van 3, 4 en 5 meter. De stelling van Pythagoras garandeert dan dat het een rechthoekige driehoek is. (Waarom?) Een pythagorisch drietal is een drietal positieve natuurlijke getallen (x, y, z) met de eigenschap dat x2 + y2 = z2. Implementeer een functie die Pythagorische drietallen genereert. De uitvoer moet zijn:
*Main> pythTriples
[(3,4,5),(6,8,10),(5,12,13),(9,12,15),(8,15,17),...
Waarom zijn er geen pythagorische drietallen (x, y, z) met x = y?
Als je dit allemaal kunt, kijk dan naar Project Euler Zet je tanden in problemen 9, 10 en 49.