[Haskell-beginners] State Monads (and OpenGL)

Tom Hobbs tvhobbs at googlemail.com
Fri Nov 5 11:55:08 EDT 2010


Hi all,

I have a program which implements Conway's Game Of Life.  It even has
an open GL UI which shockingly works.

I've followed a tutorial
(http://blog.mikael.johanssons.org/archive/2006/09/opengl-programming-in-haskell-a-tutorial-part-2/)
which tells how to get the open GL to animate, and according to my
sysouts, that's working to.  The problem I have comes with the fact
that between every frame I want to evolve my world but I'm really
struggling working out how to get the state stuff working.

Here's a snippet of my main function;

main = do
	world <- sequence (take (worldSize * worldSize) $ repeat rand) --
randomly generate a square world
	-- code snipped out
	displayCallback $= (display position world)  -- display method which
is called on every frame redraw
	mainLoop

Here, world is a [Int] and represents my cells.  The display function
as referenced by "displayCallback" is the function that is called back
to everytime the frame is redrawn.

I also have another function which takes in a world, updates the state
of the cells and the evolved world, thus;

evolve :: [Int] -> [Int]

I've been reading through (a lot of) tutorials on the state monad but
I'm not any closer to working out how I make the call to display take
some kind of updated world.

I've also got the following code;

type World = State [Int]

evolveS :: World [Int]
evolveS = do
              w <- get
              let w2 = evolve w
              put w2
              return w2

Which I believe to be the correct code for wrapping my [Int] in the
state monad but now I have two problems;

1) I don't know if it's correct
2) I don't know how to apply it, even if it is

Can anyone offer any advice?

Many thanks,

Tom


More information about the Beginners mailing list