[Haskell-cafe] Simple Interpreter with State Monad
achudnov at gmail.com
Thu Apr 7 15:09:32 UTC 2016
First, if you want to use several monads at a time, you should use monad
transformers (see the 'mtl' package). Then you could type your
interpreter function as 'execute :: Command -> StateT ParseState IO ()'
Second, ParseState including IO sounds like poor design to me
(basically, in your monad you will end up carrying two pieces of IO). I
can't explain how to do this better, because you haven't provided the
definition of ParseState and execute.
As for examples, a quick search revealed this extensive answer on
For your particular case, you might want to look at free monads, as they
may offer a cleaner way to implement what you want.
On 04/07/2016 10:29 AM, Jake wrote:
> I'm currently in a graphics class where, in order to provide a
> standard interface to all of our graphics libraries, we have to
> process small scripts that look like this:
> 0 0 0 1 1 1
> 0 0 10
> 0 0 3
> I successfully wrote a parser with attoparsec that parses the file
> into a list of Commands. Now I'm trying to process that list to
> produce an IO action, and I thought the State monad would be useful to
> keep track of the persistent state of the shapes to draw and the
> transformations on them.
> I'm confused about how exactly to do this though. What should the type
> of my State be? Right now I have an execute function that is
> execute :: Command -> State ParseState (IO ())
> where ParseState is a tuple of stuff. ParseState also includes an IO
> () because I wanted to be able to create multiple pictures one after
> another, and I couldn't figure out how to access the previous result
> value from State to add on to it in the next one.
> So can anyone offer advice on my specific situation, or maybe a
> simpler example of how to go about writing an interpreter with the
> State monad?
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Haskell-Cafe