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: haskell-bounces@haskell.org [mailto:haskell-bounces@haskell.org] 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:bulatz@HotPOP.com
_______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell