
bar = do
x <- get
y <- lift $ myAdd 1 x
put y
return y
If you want, you can write something which captures this idiom:
liftModify c = do
x <- get
y <- lift (c x)
put y
and then use that like:
bar = do
liftModify (myAdd 1)
get
On 08/11/06, Peter Steiner
hi haskellers,
i have a basic question regarding StateT encapsulating IO and the modify function.
my scenario is similar to the following simple code snippet:
import Control.Monad.State
type MyState = StateT Int IO
test = evalStateT foo 0
foo = do modify $ (+) 1 get
i would like to be able to debug what's happening inside the modifier function. that's why i want to be able to use a modifier that's in the IO monad, like in the following, obviously defunct snippet:
test = evalStateT bar 0
bar = do modify $ myAdd 1 get
myAdd :: Int -> Int -> IO Int myAdd x y = do putStr "in myAdd\n" return $ x + y
this fails because (myAdd :: Int -> Int -> IO Int) does not match the required modify argument type (Int -> Int -> Int) for MyState.
Couldn't match expected type `Int' against inferred type `IO Int' In the second argument of `($)', namely `myAdd 1' In the expression: modify $ (myAdd 1) In a 'do' expression: modify $ (myAdd 1)
is it possible to 'lift' StateT modify into the inner monad (IO in my case)?
regards, peter. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe