
C K Kashyap wrote:
In the code here - http://hpaste.org/fastcgi/hpaste.fcgi/view?id=28393#a28393 If I look at the type of modifiedImage, its simply ByteString - but isn't it actually getting into and back out of the state monad? I am of the understanding that once you into a monad, you cant get out of it? Is this breaking the "monad" scheme?
modifiedImage uses the execState function, which has the following type: execState :: State s a -> s -> s In other words, it applies a State monad value to a state, and returns a new state. Its entire purpose is to "run" the monad and obtain the resulting state. A monadic value of type "State s a" is a kind of delayed computation that doesn't do anything until you apply it to a state, using a function like execState or evalState. Once you do that, the computation runs, the monad is "evaluated away", and a result is returned. The issue about not being able to escape that (I think) you're referring to applies to the functions "within" that computation. A State monad computation typically consists of a chain of monadic functions of type (a -> State s b) composed using bind (>>=). A function in that composed chain has to return a monadic value, which constrains the ability of such a function to escape from the monad. Within a monadic function, you may deal directly with states and non-monadic values, and you may run functions like evalState or execState which eliminate monads, but the function still has to return a monadic value in the end, e.g. using "return" to lift an ordinary value into the monad. Anton