> observe $ flip runStateT 10 $ (put 0 >> mzero) <|> modify (+3) > ((),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 -> .... 2012/5/27 Roman Cheplyaka <r...@ro-che.info> > * L Corbijn <aspergesoe...@gmail.com> [2012-05-27 14:21:39+0200] > > The solution I've in mind depends on the stack being pure. When the > > monad stack is pure a rule can be applied, returning a maybe value (or > > having a MaybeT wrapper) and when returning Nothing (failed rule) > > reverting the stack to it's point before applying the rule. > > > > As I'm not quite sure about the design (nor good at software design) > > I've some questions about this approach. > > 1. Is there a better approach then using a state monad for building > > the 'products'? > > If you need to interleave building your "products" and analyzing them, > State seems a reasonable choice here. > > > 2. My solution with saving/reverting monad-stacks seems quite a > > hassle/hack, so is it a good approach or is there something better? > > You can use a backtracking monad here ([] or Logic). > > The key thing is to put the backtracking monad in the bottom of your > stack (everything above it will be restored on mzero). On the other > hand, if you want some "global" effects that should not be restored, you > can put corresponding monads below LogicT in the stack. > > Example: > > > observe $ flip runStateT 10 $ (put 0 >> mzero) <|> modify (+3) > ((),13) > > Note that "put 0" had no effect here, because it was followed by mzero. > > -- > Roman I. Cheplyaka :: http://ro-che.info/ > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe