[Haskell-cafe] Building pattern and trying monads

Roman Cheplyaka roma at ro-che.info
Sun May 27 20:34:36 CEST 2012


* L Corbijn <aspergesoepje at 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/



More information about the Haskell-Cafe mailing list