* 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

Reply via email to