content: -- The magic of Lie Algebra
  
  import Numeric.LinearAlgebra
  
  disp = putStrLn . dispf 5
  
  rot1 :: Double -> Matrix Double
  rot1 a = (3><3)
   [ 1, 0, 0
   , 0, c, s
   , 0,-s, c ]
      where c = cos a
            s = sin a
  
  g1,g2,g3 :: Matrix Double
  
  g1 = (3><3) [0, 0,0
              ,0, 0,1
              ,0,-1,0]
  
  rot2 :: Double -> Matrix Double
  rot2 a = (3><3)
   [ c, 0, s
   , 0, 1, 0
   ,-s, 0, c ]
      where c = cos a
            s = sin a
  
  g2 = (3><3) [ 0,0,1
              , 0,0,0
              ,-1,0,0]
  
  rot3 :: Double -> Matrix Double
  rot3 a = (3><3)
   [ c, s, 0
   ,-s, c, 0
   , 0, 0, 1 ]
      where c = cos a
            s = sin a
  
  g3 = (3><3) [ 0,1,0
              ,-1,0,0
              , 0,0,0]
  
  deg=pi/180
  
  -- commutator
  infix 8 &
  a & b = a <> b - b <> a
  
  infixl 6 |+|
  a |+| b = a + b + a&b /2  + (a-b)&(a & b) /12
  
  main = do
     let a =  45*deg
         b =  50*deg
         c = -30*deg
         exact = rot3 a <> rot1 b <> rot2 c
         lie = scalar a * g3 |+| scalar b * g1 |+| scalar c * g2
     putStrLn "position in the tangent space:"
     disp lie
     putStrLn "exponential map back to the group (2 terms):"
     disp (expm lie)
     putStrLn "exact position:"
     disp exact
  