[Haskell-cafe] Simple Interpreter with State Monad

Andrey Chudnov 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 
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 at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20160407/b4893071/attachment.html>


More information about the Haskell-Cafe mailing list