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)
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to