
On Thu, Apr 10, 2008 at 9:50 AM, Adam Smyczek
For a small webapi binding I try to implement a session like monad by building a stack including BrowserAction from Network.Browser module as following:
newtype RBAction a = RBAction { exec :: ErrorT String (StateT RBState BrowserAction) a } deriving (Functor, Monad, MonadState RBState)
I would like the RBAction to implement MonadIO as well, but fight with the liftIO function for hours now, without success. Any idea how the implementation of liftIO could look like?
Adam, The following worked for me: +++++ {-# LANGUAGE GeneralizedNewtypeDeriving #-} import Control.Monad.Trans import Control.Monad.State import Control.Monad.Error type BrowserAction = IO -- or something else which is in MondaIO data RBState = RBState newtype RBAction a = RBAction { exec :: ErrorT String (StateT RBState BrowserAction) a } deriving (Functor, Monad, MonadState RBState) instance MonadIO RBAction where liftIO = RBAction . liftIO +++++ Because everything inside the newtype wrapper already supports MondIO, you just need to call the version of liftIO underneath the newtype wrapper. Is that clear at all? -Antoine