
On 08/23/10 22:33, Greg wrote:
...it would be nice to force the type system to check whether I'm using degrees or radians:
data Angle a = Radians a | Degrees a deriving (Eq, Show)
You did it wrong... the difference between Radians and Degrees here is only visible at runtime, as they are both of the same type, Angle. Don't feel bad, this confused me for a while as a Haskell-beginner too. An example to "force the type system to check" would be data Radians a = Radians a deriving (Eq, Show) data Degrees a = Degrees a deriving (Eq, Show) Then you could make conversion functions, say, radToDeg :: (Floating a) => Radians a -> Degrees a degToRad :: (Floating a) => Degrees a -> Radians a and implement them; you *could* have a 'class Angle' or such, if you wanted... perhaps trig functions or such would be sensible to put in there. And/or you could try to make each data-type be a member of Num and related classes (being able to add angles, etc) For a real program, I think I would try to stick to just one unit (e.g. radians) for internal program use (and convert any outside data to that unit promptly), unless there was a reason that didn't work very well; but the typeclass-stuff is an excellent thing to play with! -Isaac