
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]
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'
now you can have routines like 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/