[Haskell-cafe] Storing functional values
nickgrey at softhome.net
nickgrey at softhome.net
Fri Jan 30 09:21:58 EST 2004
Hi,
I'm writing a game in Haskell. The game state includes a lot of closures.
For example, if a game object wants to trigger an event at a particular
time, it adds a function (WorldState -> WorldState) to a queue. Similarly
there are queues which contain lists of functions which respond to events.
(CreatureAttackEvent -> WorldState -> WorldState)
I'd like to be able to save the game state to disk so that it can be
reloaded. Obviously, these closures are now a problem, as they can't be
stored.
I could obviously, replace all the functional values with non-functional
ones, and have a big case statement specifying the behaviour associated with
each constant. However, I don't really like this solution. It means that
for each type of function which was in the game state (there are lots) I
will need a type which lists all the possible behaviours (again, there are
lots) that could occur. First of all, these types are likely to be very
large. Secondly, I'd rather the behaviours were defined in different
modules. For example, I want to have an "Orc" module which defines
functions such as "Response to orc being hit", "Response to orc picking
something up", etc. This implementation would force me to have a "Monster
reponse to being hit" MODULE, containing an orcs response, a goblins
response etc. I.e., the modules would be grouped by type of behaviour,
rather than type of monster, meaning that adding a new monster type would
require modifications accross many modules. (This example is obviously
something of a simplification, but hopefully it shows the point.)
Obviously, none of this is fatal. I could make it work. But going through
my program and replacing all the functions with values and then doing big
pattern matches against the values to find the functions seems like a very
non-functional way of doing things.
Can anyone suggest a neater design?
More information about the Haskell-Cafe
mailing list