[Haskell-cafe] Hopefully simple monad question

Holger Siegel holgersiegel74 at yahoo.de
Wed Sep 16 06:37:43 EDT 2009

Am Mittwoch, den 16.09.2009, 03:23 -0700 schrieb Gregory Propf:
> I'm playing around with a little program that implements a simple
> virtual machine.  I want to use a monad to represent machine state.  I
> created a data type for the machine (VM) and a monadic type for the
> monadic computations using it.  I declared this an instance of
> MonadState and Monad and created the usual operators.  That stuff
> works.  My issue is that I want to run some functions in the machine
> monad, call it VMS - "virtual machine w/state" and then pull the
> underlying VM data structure out and print it.
> I've read about monad transformers, lift, liftM, liftIO and all these
> instances in the libraries like MonadIO and am rather confused.  The
> most sensible conclusion I can reach is that I probably need to create
> my own Transformer monad and define liftIO.  Is this where I need to
> go?  Also, my VMS monad doesn't really do anything different from the
> State monad except explicitly specify that state is a VM and not a
> generic type.  Am I doing too much work creating my own instances
> here?  Would a simple "type" statement work?

Yes. You can use the existing implementation of state monads:

  import Control.Monad.State

and define a data type for the machine state

  data MS = VM { pc :: Int, heap :: MyHeap }

and then you can define your monad via

  type MSM = State MS

or, if you want your virtual machine to do some IO,

  type MSM = StateT IO MS

Now functions that operate on the virtual machine state might have the
following types:

isInStopState       :: MSM Bool
doOneStep           :: MSM ()
runUntilStopState   :: MSM ()
doSomeSteps         :: Int -> MSM Int

More information about the Haskell-Cafe mailing list