{- | Deal with angles measured in degrees or radians. Names are kept deliberately different from the standard prelude to avoid name clashes. -} {-# LANGUAGE GeneralizedNewtypeDeriving #-} module Data.Angle where -- | An angle in radians. newtype Radians x = Radians x deriving (Eq, Ord, Show, Num, Fractional) -- | An angle in degrees. newtype Degrees x = Degrees x deriving (Eq, Ord, Show, Num, Fractional) -- | Convert from radians to degrees. degrees :: (Floating x) => Radians x -> Degrees x degrees (Radians x) = Degrees (x/pi*180) -- | Convert from degrees to radians. radians :: (Floating x) => Degrees x -> Radians x radians (Degrees x) = Radians (x/180*pi) -- | Type-class for angles. class Angle a where sine :: (Floating x) => a x -> x cosine :: (Floating x) => a x -> x tangent :: (Floating x) => a x -> x arcsine :: (Floating x) => x -> a x arccosine :: (Floating x) => x -> a x arctangent :: (Floating x) => x -> a x instance Angle Radians where sine (Radians x) = sin x cosine (Radians x) = cos x tangent (Radians x) = tan x arcsine x = Radians (asin x) arccosine x = Radians (acos x) arctangent x = Radians (atan x) instance Angle Degrees where sine = sine . radians cosine = cosine . radians tangent = tangent . radians arcsine = degrees . arcsine arccosine = degrees . arccosine arctangent = degrees . arctangent