[Haskell-beginners] How to model this in haskell, get rid of my OO thinking?

haskell at lonely-star.org haskell at lonely-star.org
Tue May 18 09:28:45 EDT 2010


Hi,

Thanks, I think I am starting to get it :). But let me extend my
example.
Assume, (in C++) ScreenObject also has a abstract function "update"
implemented in SpaceShip and Rocket and doing something completly
different for both of them.
Now there are a lot of ScreenObjects in the "world" which have to be
updated in every frame. This is done by having a list of pointers to
ScreenObjects (objects) and a updateWorld function which looks like
this (simplified):

void updateWorld()
{
    for(o in objects)
        o->update();
}

How would you model this in haskell?
Thanks!
Nathan

On Tue, 18 May 2010 11:33:08 +0200
edgar klerks <edgar.klerks at gmail.com> wrote:

> He Nathan,
> 
> I would create an data type (SpaceObject), which holds the Position
> and an object. Then I create a typeclass for SpaceObject, which has
> the function move in it. Functions which all objects have are moved
> in the typeclass:
> 
> 
> type Position = (Double, Double)
> 
> data SpaceObject a = SO a Position
> 
> data RocketObject = RocketObject {
>                 stuff :: String
>         }
> 
> data SpaceShipObject = SpaceShipObject {
>                 bla :: Int
>         }
> 
> type Rocket = SpaceObject RocketObject
> type SpaceShip = SpaceObject SpaceShipObject
> 
> class ScreenObject a where
>         move :: a -> Position -> a
> 
> instance ScreenObject (SpaceObject obj) where
>         move (SO obj (x,y) ) (dx, dy)  = SO obj (x + dx, y + dy)
> ~
> 
> ~
> 
> ~
> 
> ~
> 
> On Tue, May 18, 2010 at 5:21 AM, <haskell at lonely-star.org> wrote:
> 
> > Hi,
> >
> > I learning haskell and I am trying to understand how model certain
> > things in it.
> > As I have been doing a lot of C++ programming so far. Let's imagine
> > we want to write a game. In the game there are spaceships and rocks
> > (image something like astroids :) ). Now both spaceships and rocks
> > have a position and can move. Spaceships can shoot, while rocks can
> > explode. In C++, I would do (simplified):
> >
> > class ScreenObject
> > {
> >   float x,y;
> >   void move(dx,dy){x+=dx;y+=dy;}
> > };
> >
> > class Spaceship : public ScreenObject
> > {
> >    void shoot(){...}
> > };
> >
> > class Rocket : public ScreenObject
> > {
> >    void explode(){...}
> > };
> >
> > But what would I do in haskell? Ok, I can define a typeclass
> > "ScreenObjectType" that has a move function (taking an object,
> > retuning an moved object).
> > But I do not want to implement "move" for both Spaceship and Rocket.
> > Can I somehow give a default implementation for move that works on
> > any datatype having an "x" and "y" element? Or what would I do?
> > Can I somehow define a "base datatype" holding a x and y member form
> > which Spaceship and Rocket derive?
> > I feel like I am thinking to much OOP here.
> > But the point is, I guess, that I want to avoid code duplication!
> >
> > So I guess, it comes down to the questions: How would you model the
> > scenario described above in haskell?
> >
> > Thanks!
> > Nathan
> > _______________________________________________
> > Beginners mailing list
> > Beginners at haskell.org
> > http://www.haskell.org/mailman/listinfo/beginners
> >
> 
> 
> 



More information about the Beginners mailing list