Angle type in Haskell
I would use newtype instead of data to define Angle, like this:

newtype Angle a = Radians { angleValueRadians :: a }


This will automatically create the angleValueRadians function to get the angle value, and will be a bit more efficient.

Here is a good answer explaining the differences between data, newtype, and type: https://stackoverflow.com/a/21081227/1525759

You could use function composition to define many of your functions instead of pattern matching (pattern matching isn't bad, I just prefer this style):

sinAngle :: (Floating a) =&gt; Angle a -&gt; a
sinAngle = sin . angleValueRadians


Also, if you made Angle an instance of Applicative, you could define addAngle like this:

addAngle :: (Floating a) =&gt; Angle a -&gt; Angle a -&gt; Angle a
addAngle r1 r2 = (+) &lt;$&gt; r1 &lt;*&gt; r2
-- or even this, because `f &lt;$&gt; x &lt;*&gt; y` is the same as `liftA2 f x y`:
addAngle = liftA2 (+)


Here's how you could do that:

instance Functor Angle where
    fmap f (Radians x) = Radians (f x)

instance Applicative Angle where
    pure = Radians       
    Radians f &lt;*&gt; r = fmap f r