Drop hier links of afbeeldingen om ze aan de editor toe te voegen.

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.

Een map voor je oefeningen

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 starten

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.

Een bestand inladen

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.

Let op: opslaan en opnieuw inladen

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:

  1. Sla het bestand op in je editor.
  2. Laad het opnieuw in met :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.

Werken aan meerdere oefeningen

: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.

Handige GHCi-commando’s

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