Je kan een oefening rechtstreeks in de editor van Dodona invullen, maar het is veel comfortabeler om eerst lokaal te werken. Zo kan je je functies meteen uitproberen in GHCi, en helpt je editor je met foutmeldingen terwijl je typt.
Maak één map waarin je al je oefeningen bewaart, bijvoorbeeld:
mkdir ~/functioneel-programmeren
cd ~/functioneel-programmeren
Maak daarin per oefening één bestand met de extensie .hs, genoemd naar de oefening: voorlaatste.hs, ggd.hs, en zo verder. Kopieer de skeletcode van Dodona in dat bestand en vul ze verder aan.
Een map per reeks oefeningen mag ook. Houd de bestanden van één reeks wel samen, want je start GHCi vanuit die map.
GHCi is de interactieve Haskell-interpreter. Ga naar de map met je oefeningen en start hem daar:
cd ~/functioneel-programmeren
stack ghci
Gebruik stack ghci en niet ghci. Zo gebruik je de GHC-versie die Stack beheert, dezelfde die ook je projecten compileert.
Start GHCi vanuit de map met je oefeningen. Dan vindt hij je bestanden zonder dat je een volledig pad moet typen.
In GHCi laad je een bestand in met :l, kort voor :load:
ghci> :l voorlaatste.hs
[1 of 2] Compiling Main ( voorlaatste.hs, interpreted )
Ok, one module loaded.
Daarna kan je elke functie uit dat bestand oproepen:
ghci> voorlaatste [1,2,3,4]
3
Met :t vraag je het type van een functie op. Zo controleer je of je type-annotatie is wat je denkt dat ze is:
ghci> :t voorlaatste
voorlaatste :: [Int] -> Int
Geef het bestand niet mee als argument (stack ghci voorlaatste.hs). Stack zoekt dan een project waar dat bestand bij hoort, vindt er geen, en waarschuwt daarover. Start GHCi zonder argumenten en laad je bestand met :l.
GHCi werkt met het bestand zoals het op schijf staat, niet zoals het in je editor staat. Pas je iets aan, dan moet je dus twee dingen doen:
:r, kort voor :reload.ghci> :r
[1 of 2] Compiling Main ( voorlaatste.hs, interpreted ) [Source file changed]
Ok, one module loaded.
Doe je dat niet, dan test je nog altijd je vorige versie. Zie je een fout die je net hebt opgelost, of blijft een functie die je net geschreven hebt “Variable not in scope”, controleer dan eerst of je hebt opgeslagen en opnieuw ingeladen.
:l vervangt wat er ingeladen was. Laad je ggd.hs in, dan is voorlaatste niet langer beschikbaar:
ghci> :l ggd.hs
[1 of 2] Compiling Main ( ggd.hs, interpreted )
Ok, one module loaded.
ghci> voorlaatste [1,2,3,4]
<interactive>:8:1: error: [GHC-88464]
Variable not in scope: voorlaatste :: [a0] -> t
Je werkt dus telkens aan één oefening. Wil je terug naar de vorige, laad je dat bestand opnieuw in met :l.
| Commando | Wat het doet |
|---|---|
:l bestand.hs |
laadt een bestand in |
:r |
laadt opnieuw in na een aanpassing |
:t expressie |
toont het type van een expressie |
:i naam |
toont info over een functie, type of class |
:q |
sluit GHCi af |
:? |
toont alle commando’s |