On Wed, Mar 17, 2010 at 09:20:49PM -0700, Darrin Chandler wrote: > Trying to get up to speed in Haskell, I'm playing with doing some > abstraction in data types. Specifically, I have this: > > type Cartesian_coord = Float > > type Latitude = Float > type Longitude = Float > > data Point = Cartesian (Cartesian_coord, Cartesian_coord) > | Spherical (Latitude, Longitude) > > type Center = Point > type Radius = Float > > data Shape = Circle Center Radius > | Polygon [Point]
phantom types can help you, providing the ability to distinguish the two without the run-time overhead of checking the Cartesioan and Spherical constructors > data Cartesian -- empty, just used for the type constructor > data Spherical > data Point a = Point Float Float > data Shape a = Circle (Point a) Radius > | Polygon [Point a] now you can have routines like > spPoint :: Latitude -> Longitude -> Point Spherical > cPoint :: Cartesian_coord -> Cartesian_coord -> Point Cartesian to create points of each, yet you can still have functions on 'Point a' that will work on any type of point. You may want to create a class that converts between the two > class Coordinated f where > toCartesian :: f Spherical -> f Cartesian > toSpherical :: f Cartesian -> f Spherical > > instance Coordinated Point where ... > instance Coordinated Shape where ... John -- John Meacham - ⑆repetae.net⑆john⑈ - http://notanumber.net/ _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe