Haskell:
Debug-output afdrukken
Hoe te:
Een eenvoudige manier om debug-informatie in Haskell af te drukken is met de print
functie, die een waarde neemt die een instantie is van de Show
typeclass en het uitvoert naar de console.
main :: IO ()
main = do
let number = 42
print number
putStrLn "Debuggen is een fluitje van een cent in Haskell!"
-- Uitvoer:
-- 42
-- Debuggen is een fluitje van een cent in Haskell!
Voor meer complexe datastructuren, zorg ervoor dat ze Show
afleiden om mooi afdrukken mogelijk te maken:
data Cake = Chocolate | Vanilla deriving Show
debugSmaak :: Cake -> IO ()
debugSmaak smaak = print smaak
main :: IO ()
main = debugSmaak Chocolate
-- Uitvoer:
-- Chocolate
Soms willen we tijdelijke debugging die later makkelijk te verwijderen is. Voer de Debug.Trace
module in.
import Debug.Trace (trace)
main :: IO ()
main = putStrLn $ trace "Dit wordt eerst afgedrukt" "Dit wordt als tweede afgedrukt"
-- Uitvoer:
-- Dit wordt eerst afgedrukt
-- Dit wordt als tweede afgedrukt
De trace
functie drukt de string af wanneer de waarde wordt geëvalueerd, maar het is een bijeffect in het pure deel van de code. Het is handig, maar gebruik met voorzichtigheid!
Diepgaand
In de goede oude tijd, zou debugging misschien de oude truc van “print statement” zijn geweest. Haskell biedt dit met een functionele draai en tools voor schonere debug-praktijken. Voer print
en de Debug.Trace
module in, zoals eerder verkend.
Alternatieven voor print
zijn onder andere putStrLn
voor strings en putStr
, als je niet van die automatische nieuwe regel houdt. Debug.Trace
heeft ook varianten zoals traceShow
die direct met Show
instanties werken, waardoor je een show
aanroep bespaart.
Wat betreft implementatiedetails, print
is in principe putStrLn . show
. Het drukt alle Show
-bare data af naar stdout. Debug.Trace
functies, aan de andere kant, zijn bedoeld voor tijdelijk gebruik tijdens de ontwikkeling. Ze sluipen in pure code en schenden referentiële transparantie, wat op de lange termijn een no-no is.
Vergeet niet de logboekbibliotheken voor serieuze applicaties, die meer controle bieden en minder “debug by print.”
Zie Ook
- De
Debug.Trace
documentatie: https://hackage.haskell.org/package/base/docs/Debug-Trace.html - Haskell Wiki over Debugging: https://wiki.haskell.org/Debugging
- Een boeiende discussie over waarom
Debug.Trace
niet gebruiken en wat in plaats daarvan te doen: https://stackoverflow.com/questions/7741400/why-is-using-debug-trace-considered-bad-practice