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