[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