Actually, I think the backtracking property here stems more from the MonadPlus StateT instance than from the properties of Maybe.
(mplus a b runs a and b by passing explicitely the same state to them).
* Yves Parès <yves.pares@gmail.com> [2012-05-28 11:28:22+0200]
> > observe $ flip runStateT 10 $ (put 0 >> mzero) <|> modify (+3)Indeed, I didn't realise that Maybe may be (no pun intended) sufficient here!
> > ((),13)
>
> If the only thing you need is backtracking, using LogicT might be a little
> overkill, using Maybe in the bottom of you monad stack suits just fine:
>
> case flip runStateT 10 $ (put 0 >> mzero) <|> modify (+3) of
> Just x -> ....
> Nothing -> ....