17 Dec
2007
17 Dec
'07
2:12 p.m.
There's a third way, too, and I haven't seen anybody mention it yet
I've noticed it, but there are some problems with this representation, so I decided not to mention it. It's OK as far as we don't want functions working on two areas - I don't see, how we can implement, say, intersect :: Shape -> Shape -> Bool in this way. However, it's a useful pattern.
(apologies if I just missed it). You can provide an explicit record of the relevant "member functions", and "instantiate" it in different ways. E.g.
data Shape = Shape { area :: Int }
square x = Shape (x^2) rectangle x y = Shape (x*y) circle r = Shape (pi*r^2)