
Reto Kramer wrote:
What I'm really looking for is not so much the chaining of StateT compositions, but rather the isolation of StateA from StateB while they both flow from the search loop into the respective library calls (foo, bar) transparently to the application programmer.
How about this? -- these two should be defined in two separate library modules, of course trueFoo :: MonadState StateA m => m () trueBar :: MonadState StateB m => m () data AppStateRec = AppStateRec { a :: StateA, b :: StateB } type Eval a = StateT AppStateRec Identity a exec :: Eval () exec = do foo bar foo foo bar where -- you might want to define combinators for the following pattern, -- but for just two functions this is good enough foo = do AppStateRec a b <- get a' <- runStateT trueFoo a put $ AppStateRec a' b bar = do AppStateRec a b <- get b' <- runStateT trueBar b put $ AppStateRec a b' -Udo -- "In the software business there are many enterprises for which it is not clear that science can help them; that science should try is not clear either." -- E. W. Dijkstra