<div dir="ltr">Andrew,<div><br></div><div>It looks like you're quickly going to hit a point where MaybeT is helpful to you. </div><div><br></div><div><a href="https://hackage.haskell.org/package/transformers-0.4.3.0/docs/Control-Monad-Trans-Maybe.html">https://hackage.haskell.org/package/transformers-0.4.3.0/docs/Control-Monad-Trans-Maybe.html</a> <br></div><div><br></div><div>This gives you a trick to ignore the fact that you're getting a maybe and make MaybeT terminate the computation early if there was nothing on the stack to make further computations with.</div><div><br></div><div>It will involve making the leap from simple monads to transformers though, which can be tricky but is worthwhile in the long run. </div><div><br></div><div>There is a fairly succinct explanation of all of this, here:</div><div><br></div><div><a href="https://wiki.haskell.org/Monad_Transformers_Tutorial">https://wiki.haskell.org/Monad_Transformers_Tutorial</a>  </div><div><br></div><div>It's just based on IO rather than State, but that makes little difference to the concept. </div><div><br></div><div>Typing this out in a rush at work, so apologies in advance if this doesn't make any sense. ;)</div><div><br></div><div>Cheers,</div><div>Ben</div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, 30 Sep 2015 at 14:22 Andrew Bernard <<a href="mailto:andrew.bernard@gmail.com">andrew.bernard@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Greetings All,<br>
<br>
I am writing code using a BankersDequeue from Data.Dequeue. I’d like to wrap the push and pop operations in a state monad for the standard reason, to avoid passing the dequeue around between function calls, and regard it as state instead, which it is. Wishing to avoid throwing a runtime error if the queue is empty (for the general case of queues) I have written a reduction of the concept using a crude stack to experiment, which uses State and Maybe. I notice that there are very few examples of using State and Maybe together. My questions are: Is this a faulty design pattern? Should this be done with monad transformers? Are there examples to be found of using State with Maybe as a monad transformer combination? Why is this pattern relatively rare, it seems? Is this program on the right track?<br>
<br>
Andrew<br>
<br>
— snip<br>
<br>
module Main where<br>
<br>
import Control.Monad.State<br>
<br>
type Stack = [Int]<br>
<br>
popIt :: Stack -> (Maybe Int, Stack)<br>
popIt [] = (Nothing, [])<br>
popIt (x:xs) = (Just x, xs)<br>
<br>
pop :: State Stack (Maybe Int)<br>
pop = state popIt<br>
<br>
push :: Int -> State Stack (Maybe ())<br>
push a = state $ \xs -> (Just (), a:xs)<br>
<br>
main = do<br>
  let a = evalState (do<br>
                     push 3<br>
                     push 2<br>
                     push 1<br>
                     pop<br>
                     pop<br>
                     a <- pop<br>
                     return a<br>
                   ) []<br>
  print a<br>
<br>
— snip<br>
<br>
<br>
<br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div>