In de vorige oefening schreven we een stack die foute programma’s kan verwerken. Veel helpt dit echter niet bij het debuggen van deze foute programma’s. Daarom willen we nog een stap verder gaan: we willen middenin onze berekeningen onze stack kunnen bekijken.
We willen daarvoor een echo :: MaybeT (State Stack) ()
toevoegen. We kunnen binnen deze functie echter geen gebruik maken van IO zonder de IO Monad. Gelukkig kunnen we dit eenvoudig oplossen: we vervangen in onze voorgaande definitie de Identity
Monad door de IO
Monad. Zo wordt echo :: MaybeT (StateT Stack Identity) ()
(zie hier1 waar die Identity
plots vandaan komt) dan echo :: MaybeT (StateT Stack IO) ()
.
Maak de nodige aanpassingen aan jouw oplossing van de voorgaande oefening, om in de skeletcode hieronder te passen.
> runStateT (runMaybeT $ do { push 3; push 4; push 5; echo; add; echo; mul; pop }) []
5
9
(Just 27,[])
> runStateT (runMaybeT $ do { push 3; echo; pop; echo }) []
3
(Nothing,[])
> runStateT (runMaybeT $ do { push 3; echo; pop; echo }) [] -- "echo" faalt als er geen waarde is
3
(Nothing,[])