[Haskell-cafe] Monad transformers [Stacking monads]
Andrew Coppin
andrewcoppin at btinternet.com
Sun Oct 5 12:32:29 EDT 2008
David Menendez wrote:
> So it might be possible to rewrite your code along these lines:
>
> type M = StateT State []
>
> run :: Foo -> M ()
>
> runOr :: Foo -> Foo -> M ()
> runOr x y = mplus (run x) (run y)
>
> runAnd :: Foo -> Foo -> M ()
> runAnd x y = run x >> run y
>
> The type "StateT State [] alpha" is isomorphic to "State -> [(alpha,
> State)]", which means that each of the computations in mplus gets its
> own copy of the state.
>
> There are a few ways to add exceptions to this, depending on how you
> want the exceptions to interact with the non-determinism.
>
> 2. StateT State (NondetT (Either ErrorType)) alpha
>
I have some longwinded code that works, but I'm still thinking about how
to do this more elegantly. It looks like what I really need is something
like
type M = StateT State (ResultSetT (ErrorT ErrorType Identity))
Is that the correct ordering?
If so, I guess that means I have to somehow construct ResultSetT. Is
there an easy way to do that, given that I already have ResultSet? For
example, if I put ResultSet into Traversable, would that let me do it?
More information about the Haskell-Cafe
mailing list