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

Reply via email to