Bulat, Bulat wrote:
> just create list of draw functions itself: > > [drawCircle (10,10) 5, drawSquare (20,20) 10] No! the exercise is about lists of shapes not lists of results of drawing shapes. This is clearly a major difference. Bulat wrote: > for more complex tasks - declare interface as a structure: > > data ShapeInterface = Shape { draw :: IO (), > moveTo :: Point -> IO (), > calcArea :: Float > } No! You miss the point that the different shapes differ regarding state types. You don't have a chance when you use one datatype. haskell-cafe? Ralf > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On > Behalf Of Bulat Ziganshin > Sent: Thursday, June 23, 2005 12:18 AM > To: Andrew Ward > Cc: Pal-Kristian Engstad; haskell@haskell.org > Subject: Re[2]: [Haskell] Dynamic binding > > Hello Andrew, > > Thursday, June 23, 2005, 5:38:03 AM, you wrote: > > AW> To handle the problem of drawing all shapes, in c++, I would have a > list > AW> of shape pointers: > > AW> struct shape{ virtual void draw(...);}; > AW> struct circle : public shape {...}; > AW> struct square : public shape {...}; > AW> std::list<shape *> shapes; > AW> for(std::list<shape *>::iterator it = shapes.begin();it != > AW> shapes.end();++it) > { (*it)->>draw(...); } > > AW> This general pattern of dynamic binding I use over and over again. > Could > AW> you give me some example code of this type of thing handled in > Haskell's > AW> way? Assuming that the number of classes deriving from shape might get > AW> quite large. > > just create list of draw functions itself: > > [drawCircle (10,10) 5, drawSquare (20,20) 10] > > you are not expected that this problem can be solved with one line of > code? :) > > > for more complex tasks - declare interface as a structure: > > data ShapeInterface = Shape { draw :: IO (), > moveTo :: Point -> IO (), > calcArea :: Float > } > > > and return this structures from "constructor" functions: > > circle x y r = Shape { draw = drawCircle center r, > moveTo newCenter = ...., > calcArea = pi*r*r > } > where center = Point x y > > square x y size = Shape { draw = ...., > moveTo newCenter = ...., > calcArea = size*szie > } > > figures = [circle 1 2 3, square 4 5 6, circle 7 8 9] > > > > of course, you cannot use inherited field names when using this > technique :) > > -- > Best regards, > Bulat mailto:[EMAIL PROTECTED] > > > > _______________________________________________ > Haskell mailing list > Haskell@haskell.org > http://www.haskell.org/mailman/listinfo/haskell _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell