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 poppen 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,[])