On 12 Oct 2008, at 21:08, Andrew Coppin wrote:
> I found that by using the brief and easily memorable construction
> "runIdentity $ runListT $ runStateT foo state" I can get at the
> result set for each action, and combine them. But nothing in hell
> seems to transform this from [((), MyState)] back into MyMonad ().
Well, State monad (and StateT transformer) doesn't work with STATE,
they work with STATE CHANGES. So, instead of [((), MyState], you
should have something like (MyState -> [((), MyState)]). And that can
be transformed to MyMonad () quite easily:
Prelude Control.Monad.State Control.Monad.List
Control.Monad.Identity> :t \f -> StateT $ ListT . Identity . f
\f -> StateT $ ListT . Identity . f :: (s -> [(a, s)]) -> StateT s
(ListT Identity) a