
Hello,
Unfortunately, the current situation is that State is only available as a lazy monad, and StateT is only available as a strict monad.
There is no such distinction in monadLib. The state transformer inherits its behavior from the underlying monad. For example: StateT Int IO is strict, but StatT Int Id is lazy. One way to get a strict state monad with monadLib is like this: import MonadLib data Lift a = Lift { runLift :: a } instance Monad Lift where return x = Lift x Lift x >>= f = f x strict = runLift $ runStateT 2 $ do undefined return 5 lazy = runId $ runStateT 2 $ do undefined return 5 The difference between those two is that "strict == undefined", while "lazy = (5,undefined)". Unfortunately the monad "Lift" is not part of monadLib at the moment so you have to define it on your own, like I did above, but I think that this is a good example of when it is useful, so I will probably add it to the next release. -Iavor