
Thomas Davie
Yes, and you can indeed do a similar thing in Haskell. The natural thing to do here would be to define a type Shape...
data Shape = Circle Int | Rectangle Int Int | Square Int
If however, you *really* want to keep your shapes as being seperate types, then you'll want to invoke the class system (note, not the same as OO classes).
class Shape a where area :: a -> Int
newtype Circle = C Int
instance Shape Circle where area (C r) = pi * r^2
There's a third way, too, and I haven't seen anybody mention it yet (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) -k -- If I haven't seen further, it is by standing in the footprints of giants