
On Tue, 7 Apr 2009, Stephan Friedrichs wrote:
My solution is this transformer:
newtype ConsumerT c m a = ConsumerT { runConsumerT :: [c] -> m (a, [c]) }
instance (Monad m) => Monad (ConsumerT c m) where return x = ConsumerT $ \cs -> return (x, cs) m >>= f = ConsumerT $ \cs -> do ~(x, cs') <- runConsumerT m cs runConsumerT (f x) cs' fail msg = ConsumerT $ const (fail msg)
But this is precisely the StateT, wrapped in a newtype and with restricted operations on it. You could as well define newtype ConsumerT c m a = ConsumerT { runConsumerT :: StateT [c] m a } instance (Monad m) => Monad (ConsumerT c m) where return x = ConsumerT $ return x m >>= f = ConsumerT $ runConsumerT . f =<< runConsumerT m