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 StackOverflow: https://stackoverflow.com/questions/16970431/implementing-a-language-interpreter-in-haskell#16971570

For your particular case, you might want to look at free monads, as they may offer a cleaner way to implement what you want.  http://www.haskellforall.com/2012/06/you-could-have-invented-free-monads.html

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:

line
0 0 0 1 1 1
circle
0 0 10
scale
0 0 3
save
pic.png

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?

Thanks,
Jake


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe