Haskell: "how much" of a type should functions receive? and avoiding complete "reconstruction"
Posted
by
L01man
on Stack Overflow
See other posts from Stack Overflow
or by L01man
Published on 2012-06-10T10:06:33Z
Indexed on
2012/06/10
10:40 UTC
Read the original article
Hit count: 290
I've got these data types:
data PointPlus = PointPlus
{ coords :: Point
, velocity :: Vector
} deriving (Eq)
data BodyGeo = BodyGeo
{ pointPlus :: PointPlus
, size :: Point
} deriving (Eq)
data Body = Body
{ geo :: BodyGeo
, pict :: Color
} deriving (Eq)
It's the base datatype for characters, enemies, objects, etc. in my game (well, I just have two rectangles as the player and the ground right now :p).
When a key, the characters moves right, left or jumps by changing its velocity
. Moving is done by adding the velocity
to the coords
. Currently, it's written as follows:
move (PointPlus (x, y) (xi, yi)) = PointPlus (x + xi, y + yi) (xi, yi)
I'm just taking the PointPlus
part of my Body
and not the entire Body
, otherwise it would be:
move (Body (BodyGeo (PointPlus (x, y) (xi, yi)) wh) col) = (Body (BodyGeo (PointPlus (x + xi, y + yi) (xi, yi)) wh) col)
Is the first version of move
better? Anyway, if move
only changes PointPlus
, there must be another function that calls it inside a new Body
. I explain: there's a function update
which is called to update the game state; it is passed the current game state, a single Body
for now, and returns the updated Body
.
update (Body (BodyGeo (PointPlus xy (xi, yi)) wh) pict) = (Body (BodyGeo (move (PointPlus xy (xi, yi))) wh) pict)
That tickles me. Everything is kept the same within Body
except the PointPlus
. Is there a way to avoid this complete "reconstruction" by hand? Like in:
update body = backInBody $ move $ pointPlus body
Without having to define backInBody
, of course.
© Stack Overflow or respective owner