diff --git a/Quat.hs b/Quat.hs
--- a/Quat.hs
+++ b/Quat.hs
@@ -1,6 +1,7 @@
 {-# OPTIONS_GHC -Wall #-}
 {-# Language StandaloneDeriving #-}
 {-# Language DeriveDataTypeable #-}
+{-# Language DeriveFunctor #-}
 
 module Quat ( Quat(..)
             , zipWithQuat
@@ -18,9 +19,7 @@
 
 deriving instance Typeable1 Quat
 deriving instance Data a => Data (Quat a)
-
-instance Functor Quat where
-  fmap f (Quat q0 q1 q2 q3) = Quat (f q0) (f q1) (f q2) (f q3)
+deriving instance Functor Quat
 
 zipWithQuat :: (a -> b -> c) -> Quat a -> Quat b -> Quat c
 zipWithQuat f (Quat p0 p1 p2 p3) (Quat q0 q1 q2 q3) = Quat (f p0 q0) (f p1 q1) (f p2 q2) (f p3 q3)
diff --git a/SpatialMath.hs b/SpatialMath.hs
--- a/SpatialMath.hs
+++ b/SpatialMath.hs
@@ -1,6 +1,7 @@
 {-# OPTIONS_GHC -Wall #-}
 {-# Language StandaloneDeriving #-}
 {-# Language DeriveDataTypeable #-}
+{-# Language DeriveFunctor #-}
 
 module SpatialMath ( module Xyz
                    , module Quat
@@ -36,11 +37,11 @@
 import Data.Data ( Data )
 import Data.Typeable ( Typeable1 )
 
-
-data Euler a = Euler a a a deriving (Eq, Show)
+data Euler a = Euler a a a deriving (Eq, Show) -- {yaw, pitch, roll}
 
 deriving instance Typeable1 Euler
 deriving instance Data a => Data (Euler a)
+deriving instance Functor Euler
 
 rotateXyzAboutX :: Floating a => Xyz a -> a -> Xyz a
 rotateXyzAboutX (Xyz ax ay az) rotAngle = Xyz bx by bz
diff --git a/spatial-math.cabal b/spatial-math.cabal
--- a/spatial-math.cabal
+++ b/spatial-math.cabal
@@ -1,5 +1,5 @@
 name:                spatial-math
-version:             0.1.6
+version:             0.1.7
 synopsis:            3d math including quaternions/euler angles/dcms and utility functions
 description:         This is a port of my 'mathlib' C library: https://github.com/ghorn/mathlib
 license:             BSD3
