Eerder werkten we al met een stack binnen de State
Monad, maar daarbij vergaten we een detail om het makkelijker te maken: wat moet er gebeuren als we proberen pop
pen van een lege stack?
Met onze vorige implementatie liepen we vermoedelijk op runtime-errors, wat we natuurlijk proberen vermijden. De typische manier om dit op te vangen is door gebruik te maken van Maybe
. We bevinden ons echter reeds in de State
Monad, dus het lijkt een probleem om ook de Maybe
Monad te introduceren. Gelukkig kennen we intussen MonadTransformers.
Definieer in onderstaande code de MaybeT
MonadTransformer, en vul de ontbrekende implementaties aan.
> runState (runMaybeT $ do { lift $ push 1; lift $ push 2; add; pop }) []
(Just 3,[])
> runState (runMaybeT $ do { lift $ push 1; lift $ push 2; add; pop; pop }) []
(Nothing,[])
> runState (runMaybeT $ do { lift $ push 1; add; pop }) []
(Nothing,[])