[Haskell-cafe] Tutorial for using the state monad or a better
jefferson.r.heard at gmail.com
Fri Feb 22 12:13:30 EST 2008
Thanks. There seems to be some consensus developing around using
IORefs to hold all the program state.
On Fri, Feb 22, 2008 at 12:11 PM, Brandon S. Allbery KF8NH
<allbery at ece.cmu.edu> wrote:
> On Feb 22, 2008, at 9:15 , Jefferson Heard wrote:
> > Now I'm to the point of making this thing interactive, and I I'm
> > trying to figure out the Haskell way of doing this. Last time I wrote
> > a program like this, I made a record data type with all the state and
> > placed it into an IORef and curried it into the GLUT callback
> > functions. I'm going to do the same thing now if there aren't cringes
> > and wailings from people with a better sense of pure-functional
> > aesthetics out there on the list with a willingness to either point me
> > towards a tutorial that would help me do this better. Keep in mind
> > that Graphics.UI.GLUT callbacks all want to return an IO (), and thus
> > leftover state monads at ends of functions aren't going to be
> > acceptable to the standard library...
> What I do (with gtk2hs) is visible at http://hpaste.org/3137 ---
> MWPState is a fairly large record.
> I will note that this code stores the mutable data in separate
> IORefs, whereas I'm told that it's better to use a single IORef with
> all the mutable state inside it. (For some reason I had assumed that
> the overhead would be higher.) That said, the wrappers make it
> fairly easy to refactor it. Since the IORef(s) and much of the
> remaining state is read-only, I use a ReaderT IO instead of StateT
> IO; this also turned out to be convenient for what turned out to be a
> significant optimization (in response to a timer firing, it collects
> a bunch of data and feeds it into a TreeView, and it turned out to be
> useful to collect it all at the front and use local to roll a
> modified record with the cached values).
> (The code in that paste is rather out of date, probably I should
> update it.)
> brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery at kf8nh.com
> system administrator [openafs,heimdal,too many hats] allbery at ece.cmu.edu
> electrical and computer engineering, carnegie mellon university KF8NH
I try to take things like a crow; war and chaos don't always ruin a
picnic, they just mean you have to be careful what you swallow.
-- Jessica Edwards
More information about the Haskell-Cafe