-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Linear Algebra -- -- Types and combinators for linear algebra on free vector spaces @package linear @version 0.7 -- | Orphans module Linear.Instances instance Traversable1 Complex instance Foldable1 Complex instance Traversable Complex instance Foldable Complex instance Monad Complex instance Bind Complex instance Applicative Complex instance Apply Complex instance Functor Complex instance (Hashable k, Eq k) => Bind (HashMap k) instance (Hashable k, Eq k) => Apply (HashMap k) -- | Operations on free vector spaces. module Linear.Vector -- | A vector is an additive group with additional structure. class Bind f => Additive f where zero = pure 0 ^+^ = liftA2 (+) ^-^ = liftA2 (-) lerp alpha u v = alpha *^ u ^+^ (1 - alpha) *^ v zero :: (Additive f, Num a) => f a (^+^) :: (Additive f, Num a) => f a -> f a -> f a (^-^) :: (Additive f, Num a) => f a -> f a -> f a lerp :: (Additive f, Num a) => a -> f a -> f a -> f a -- | Compute the negation of a vector -- --
--   >>> negated (V2 2 4)
--   V2 (-2) (-4)
--   
negated :: (Functor f, Num a) => f a -> f a -- | Compute the right scalar product -- --
--   >>> V2 3 4 ^* 2
--   V2 6 8
--   
(^*) :: (Functor f, Num a) => f a -> a -> f a -- | Compute the left scalar product -- --
--   >>> 2 *^ V2 3 4
--   V2 6 8
--   
(*^) :: (Functor f, Num a) => a -> f a -> f a -- | Compute division by a scalar on the right. (^/) :: (Functor f, Fractional a) => f a -> a -> f a -- | Produce a default basis for a vector space. If the dimensionality of -- the vector space is not statically known, see basisFor. basis :: (Applicative t, Traversable t, Num a) => [t a] -- | Produce a default basis for a vector space from which the argument is -- drawn. basisFor :: (Traversable t, Enum a, Num a) => t a -> [t a] instance Additive Complex instance Additive ((->) b) instance (Eq k, Hashable k) => Additive (HashMap k) instance Ord k => Additive (Map k) instance Additive IntMap -- | Testing for values near zero module Linear.Epsilon -- | Provides a fairly subjective test to see if a quantity is near zero. -- --
--   >>> nearZero (1e-11 :: Double)
--   False
--   
-- --
--   >>> nearZero (1e-17 :: Double)
--   True
--   
-- --
--   >>> nearZero (1e-5 :: Float)
--   False
--   
-- --
--   >>> nearZero (1e-7 :: Float)
--   True
--   
class Num a => Epsilon a nearZero :: Epsilon a => a -> Bool instance Epsilon Double instance Epsilon Float -- | Free metric spaces module Linear.Metric -- | A free inner product/metric space class Applicative f => Metric f where quadrance v = dot v v qd f g = quadrance (liftA2 (-) f g) distance f g = norm (liftA2 (-) f g) norm v = sqrt (dot v v) signorm v = fmap (/ m) v where m = norm v dot :: (Metric f, Num a) => f a -> f a -> a quadrance :: (Metric f, Num a) => f a -> a qd :: (Metric f, Num a) => f a -> f a -> a distance :: (Metric f, Floating a) => f a -> f a -> a norm :: (Metric f, Floating a) => f a -> a signorm :: (Metric f, Floating a) => f a -> f a -- | Normalize a Metric functor to have unit norm. This -- function does not change the functor if its norm is 0 or 1. normalize :: (Floating a, Metric f, Epsilon a) => f a -> f a -- | Corepresentable functors as vector spaces module Linear.Core -- | A Functor f is corepresentable if it is isomorphic to -- (x -> a) for some x. Nearly all such functors can be -- represented by choosing x to be the set of lenses that are -- polymorphic in the contents of the Functor, that is to say -- x = Rep f is a valid choice of x for -- (nearly) every Representable Functor. class Functor f => Core f core :: Core f => ((forall g x. Functor g => (x -> g x) -> f x -> g (f x)) -> a) -> f a -- | 2-D Vectors module Linear.V2 -- | A 2-dimensional vector -- --
--   >>> pure 1 :: V2 Int
--   V2 1 1
--   
-- --
--   >>> V2 1 2 + V2 3 4
--   V2 4 6
--   
-- --
--   >>> V2 1 2 * V2 3 4
--   V2 3 8
--   
-- --
--   >>> sum (V2 1 2)
--   3
--   
data V2 a V2 :: a -> a -> V2 a -- | A space that distinguishes 2 orthogonal basis vectors _x and -- _y, but may have more. class R2 t where _x = _xy . _x _y = _xy . _y _x :: (R2 t, Functor f) => (a -> f a) -> t a -> f (t a) _y :: (R2 t, Functor f) => (a -> f a) -> t a -> f (t a) _xy :: (R2 t, Functor f) => (V2 a -> f (V2 a)) -> t a -> f (t a) -- | the counter-clockwise perpendicular vector -- --
--   >>> perp $ V2 10 20
--   V2 (-20) 10
--   
perp :: Num a => V2 a -> V2 a instance Typeable1 V2 instance Eq a => Eq (V2 a) instance Ord a => Ord (V2 a) instance Show a => Show (V2 a) instance Read a => Read (V2 a) instance Data a => Data (V2 a) instance Ix a => Ix (V2 a) instance Storable a => Storable (V2 a) instance Epsilon a => Epsilon (V2 a) instance Distributive V2 instance Core V2 instance R2 V2 instance Metric V2 instance Fractional a => Fractional (V2 a) instance Num a => Num (V2 a) instance Monad V2 instance Bind V2 instance Additive V2 instance Applicative V2 instance Apply V2 instance Traversable1 V2 instance Foldable1 V2 instance Traversable V2 instance Foldable V2 instance Functor V2 -- | 3-D Vectors module Linear.V3 -- | A 3-dimensional vector data V3 a V3 :: a -> a -> a -> V3 a -- | cross product cross :: Num a => V3 a -> V3 a -> V3 a -- | scalar triple product triple :: Num a => V3 a -> V3 a -> V3 a -> a -- | A space that distinguishes 2 orthogonal basis vectors _x and -- _y, but may have more. class R2 t where _x = _xy . _x _y = _xy . _y _x :: (R2 t, Functor f) => (a -> f a) -> t a -> f (t a) _y :: (R2 t, Functor f) => (a -> f a) -> t a -> f (t a) _xy :: (R2 t, Functor f) => (V2 a -> f (V2 a)) -> t a -> f (t a) -- | A space that distinguishes 3 orthogonal basis vectors: _x, -- _y, and _z. (It may have more) class R2 t => R3 t _z :: (R3 t, Functor f) => (a -> f a) -> t a -> f (t a) _xyz :: (R3 t, Functor f) => (V3 a -> f (V3 a)) -> t a -> f (t a) instance Typeable1 V3 instance Eq a => Eq (V3 a) instance Ord a => Ord (V3 a) instance Show a => Show (V3 a) instance Read a => Read (V3 a) instance Data a => Data (V3 a) instance Ix a => Ix (V3 a) instance Epsilon a => Epsilon (V3 a) instance Storable a => Storable (V3 a) instance Core V3 instance R3 V3 instance R2 V3 instance Distributive V3 instance Metric V3 instance Fractional a => Fractional (V3 a) instance Num a => Num (V3 a) instance Monad V3 instance Bind V3 instance Additive V3 instance Applicative V3 instance Apply V3 instance Traversable1 V3 instance Foldable1 V3 instance Traversable V3 instance Foldable V3 instance Functor V3 -- | 4-D Vectors module Linear.V4 -- | A 4-dimensional vector. data V4 a V4 :: a -> a -> a -> a -> V4 a -- | Convert a 3-dimensional affine vector into a 4-dimensional homogeneous -- vector. vector :: Num a => V3 a -> V4 a -- | Convert a 3-dimensional affine point into a 4-dimensional homogeneous -- vector. point :: Num a => V3 a -> V4 a -- | A space that distinguishes 2 orthogonal basis vectors _x and -- _y, but may have more. class R2 t where _x = _xy . _x _y = _xy . _y _x :: (R2 t, Functor f) => (a -> f a) -> t a -> f (t a) _y :: (R2 t, Functor f) => (a -> f a) -> t a -> f (t a) _xy :: (R2 t, Functor f) => (V2 a -> f (V2 a)) -> t a -> f (t a) -- | A space that distinguishes 3 orthogonal basis vectors: _x, -- _y, and _z. (It may have more) class R2 t => R3 t _z :: (R3 t, Functor f) => (a -> f a) -> t a -> f (t a) _xyz :: (R3 t, Functor f) => (V3 a -> f (V3 a)) -> t a -> f (t a) -- | A space that distinguishes orthogonal basis vectors _x, -- _y, _z, _w. (It may have more.) class R3 t => R4 t _w :: (R4 t, Functor f) => (a -> f a) -> t a -> f (t a) _xyzw :: (R4 t, Functor f) => (V4 a -> f (V4 a)) -> t a -> f (t a) instance Typeable1 V4 instance Eq a => Eq (V4 a) instance Ord a => Ord (V4 a) instance Show a => Show (V4 a) instance Read a => Read (V4 a) instance Data a => Data (V4 a) instance Ix a => Ix (V4 a) instance Epsilon a => Epsilon (V4 a) instance Storable a => Storable (V4 a) instance Core V4 instance R4 V4 instance R3 V4 instance R2 V4 instance Distributive V4 instance Metric V4 instance Fractional a => Fractional (V4 a) instance Num a => Num (V4 a) instance Monad V4 instance Bind V4 instance Additive V4 instance Apply V4 instance Applicative V4 instance Traversable1 V4 instance Foldable1 V4 instance Traversable V4 instance Foldable V4 instance Functor V4 -- | Plücker coordinates for lines in 3d homogeneous space. module Linear.Plucker -- | Plücker coordinates for lines in a 3-dimensional space. data Plucker a Plucker :: a -> a -> a -> a -> a -> a -> Plucker a -- | Valid Plücker coordinates p will have squaredError -- p == 0 -- -- That said, floating point makes a mockery of this claim, so you may -- want to use nearZero. squaredError :: (Eq a, Num a) => Plucker a -> a -- | Checks if the line is near-isotropic (isotropic vectors in this -- quadratic space represent lines in real 3d space) isotropic :: Epsilon a => Plucker a -> Bool -- | This isn't th actual metric because this bilinear form gives rise to -- an isotropic quadratic space (><) :: Num a => Plucker a -> Plucker a -> a -- | Given a pair of points represented by homogeneous coordinates generate -- Plücker coordinates for the line through them. plucker :: Num a => V4 a -> V4 a -> Plucker a -- | Checks if the two vectors intersect (or nearly intersect) intersects :: Epsilon a => Plucker a -> Plucker a -> Bool -- | These elements form a basis for the Plücker space, or the Grassmanian -- manifold Gr(2,V4). -- --
--   p01 :: Lens' (Plucker a) a
--   p02 :: Lens' (Plucker a) a
--   p03 :: Lens' (Plucker a) a
--   p23 :: Lens' (Plucker a) a
--   p31 :: Lens' (Plucker a) a
--   p12 :: Lens' (Plucker a) a
--   
p01 :: Functor f => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form a basis for the Plücker space, or the Grassmanian -- manifold Gr(2,V4). -- --
--   p01 :: Lens' (Plucker a) a
--   p02 :: Lens' (Plucker a) a
--   p03 :: Lens' (Plucker a) a
--   p23 :: Lens' (Plucker a) a
--   p31 :: Lens' (Plucker a) a
--   p12 :: Lens' (Plucker a) a
--   
p02 :: Functor f => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form a basis for the Plücker space, or the Grassmanian -- manifold Gr(2,V4). -- --
--   p01 :: Lens' (Plucker a) a
--   p02 :: Lens' (Plucker a) a
--   p03 :: Lens' (Plucker a) a
--   p23 :: Lens' (Plucker a) a
--   p31 :: Lens' (Plucker a) a
--   p12 :: Lens' (Plucker a) a
--   
p03 :: Functor f => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form an alternate basis for the Plücker space, or the -- Grassmanian manifold Gr(2,V4). -- --
--   p10 :: Num a => Lens' (Plucker a) a
--   p20 :: Num a => Lens' (Plucker a) a
--   p30 :: Num a => Lens' (Plucker a) a
--   p32 :: Num a => Lens' (Plucker a) a
--   p13 :: Num a => Lens' (Plucker a) a
--   p21 :: Num a => Lens' (Plucker a) a
--   
p10 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form a basis for the Plücker space, or the Grassmanian -- manifold Gr(2,V4). -- --
--   p01 :: Lens' (Plucker a) a
--   p02 :: Lens' (Plucker a) a
--   p03 :: Lens' (Plucker a) a
--   p23 :: Lens' (Plucker a) a
--   p31 :: Lens' (Plucker a) a
--   p12 :: Lens' (Plucker a) a
--   
p12 :: Functor f => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form an alternate basis for the Plücker space, or the -- Grassmanian manifold Gr(2,V4). -- --
--   p10 :: Num a => Lens' (Plucker a) a
--   p20 :: Num a => Lens' (Plucker a) a
--   p30 :: Num a => Lens' (Plucker a) a
--   p32 :: Num a => Lens' (Plucker a) a
--   p13 :: Num a => Lens' (Plucker a) a
--   p21 :: Num a => Lens' (Plucker a) a
--   
p13 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form an alternate basis for the Plücker space, or the -- Grassmanian manifold Gr(2,V4). -- --
--   p10 :: Num a => Lens' (Plucker a) a
--   p20 :: Num a => Lens' (Plucker a) a
--   p30 :: Num a => Lens' (Plucker a) a
--   p32 :: Num a => Lens' (Plucker a) a
--   p13 :: Num a => Lens' (Plucker a) a
--   p21 :: Num a => Lens' (Plucker a) a
--   
p20 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form an alternate basis for the Plücker space, or the -- Grassmanian manifold Gr(2,V4). -- --
--   p10 :: Num a => Lens' (Plucker a) a
--   p20 :: Num a => Lens' (Plucker a) a
--   p30 :: Num a => Lens' (Plucker a) a
--   p32 :: Num a => Lens' (Plucker a) a
--   p13 :: Num a => Lens' (Plucker a) a
--   p21 :: Num a => Lens' (Plucker a) a
--   
p21 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form a basis for the Plücker space, or the Grassmanian -- manifold Gr(2,V4). -- --
--   p01 :: Lens' (Plucker a) a
--   p02 :: Lens' (Plucker a) a
--   p03 :: Lens' (Plucker a) a
--   p23 :: Lens' (Plucker a) a
--   p31 :: Lens' (Plucker a) a
--   p12 :: Lens' (Plucker a) a
--   
p23 :: Functor f => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form an alternate basis for the Plücker space, or the -- Grassmanian manifold Gr(2,V4). -- --
--   p10 :: Num a => Lens' (Plucker a) a
--   p20 :: Num a => Lens' (Plucker a) a
--   p30 :: Num a => Lens' (Plucker a) a
--   p32 :: Num a => Lens' (Plucker a) a
--   p13 :: Num a => Lens' (Plucker a) a
--   p21 :: Num a => Lens' (Plucker a) a
--   
p30 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form a basis for the Plücker space, or the Grassmanian -- manifold Gr(2,V4). -- --
--   p01 :: Lens' (Plucker a) a
--   p02 :: Lens' (Plucker a) a
--   p03 :: Lens' (Plucker a) a
--   p23 :: Lens' (Plucker a) a
--   p31 :: Lens' (Plucker a) a
--   p12 :: Lens' (Plucker a) a
--   
p31 :: Functor f => (a -> f a) -> Plucker a -> f (Plucker a) -- | These elements form an alternate basis for the Plücker space, or the -- Grassmanian manifold Gr(2,V4). -- --
--   p10 :: Num a => Lens' (Plucker a) a
--   p20 :: Num a => Lens' (Plucker a) a
--   p30 :: Num a => Lens' (Plucker a) a
--   p32 :: Num a => Lens' (Plucker a) a
--   p13 :: Num a => Lens' (Plucker a) a
--   p21 :: Num a => Lens' (Plucker a) a
--   
p32 :: (Functor f, Num a) => (a -> f a) -> Plucker a -> f (Plucker a) instance Eq a => Eq (Plucker a) instance Ord a => Ord (Plucker a) instance Show a => Show (Plucker a) instance Read a => Read (Plucker a) instance Epsilon a => Epsilon (Plucker a) instance Metric Plucker instance Storable a => Storable (Plucker a) instance Fractional a => Fractional (Plucker a) instance Num a => Num (Plucker a) instance Ix a => Ix (Plucker a) instance Traversable1 Plucker instance Foldable1 Plucker instance Traversable Plucker instance Foldable Plucker instance Core Plucker instance Distributive Plucker instance Monad Plucker instance Bind Plucker instance Additive Plucker instance Applicative Plucker instance Apply Plucker instance Functor Plucker -- | Involutive rings module Linear.Conjugate -- | An involutive ring class Num a => Conjugate a where conjugate = id conjugate :: Conjugate a => a -> a instance (Conjugate a, RealFloat a) => Conjugate (Complex a) instance Conjugate Float instance Conjugate Double instance Conjugate Word8 instance Conjugate Word16 instance Conjugate Word32 instance Conjugate Word64 instance Conjugate Word instance Conjugate Int8 instance Conjugate Int16 instance Conjugate Int32 instance Conjugate Int64 instance Conjugate Int instance Conjugate Integer -- | Quaternions module Linear.Quaternion -- | Quaternions data Quaternion a Quaternion :: a -> {-# UNPACK #-} !(V3 a) -> Quaternion a -- | A vector space that includes the basis elements _e and -- _i class Complicated t _e :: (Complicated t, Functor f) => (a -> f a) -> t a -> f (t a) _i :: (Complicated t, Functor f) => (a -> f a) -> t a -> f (t a) -- | A vector space that includes the basis elements _e, _i, -- _j and _k class Complicated t => Hamiltonian t _j :: (Hamiltonian t, Functor f) => (a -> f a) -> t a -> f (t a) _k :: (Hamiltonian t, Functor f) => (a -> f a) -> t a -> f (t a) _ijk :: (Hamiltonian t, Functor f) => (V3 a -> f (V3 a)) -> t a -> f (t a) -- | Spherical linear interpolation between two quaternions. slerp :: RealFloat a => Quaternion a -> Quaternion a -> a -> Quaternion a -- | asin with a specified branch cut. asinq :: RealFloat a => Quaternion a -> Quaternion a -> Quaternion a -- | acos with a specified branch cut. acosq :: RealFloat a => Quaternion a -> Quaternion a -> Quaternion a -- | atan with a specified branch cut. atanq :: RealFloat a => Quaternion a -> Quaternion a -> Quaternion a -- | asinh with a specified branch cut. asinhq :: RealFloat a => Quaternion a -> Quaternion a -> Quaternion a -- | acosh with a specified branch cut. acoshq :: RealFloat a => Quaternion a -> Quaternion a -> Quaternion a -- | atanh with a specified branch cut. atanhq :: RealFloat a => Quaternion a -> Quaternion a -> Quaternion a -- | norm of the imaginary component absi :: Floating a => Quaternion a -> a -- | raise a Quaternion to a scalar power pow :: RealFloat a => Quaternion a -> a -> Quaternion a -- | Apply a rotation to a vector. rotate :: (Conjugate a, RealFloat a) => Quaternion a -> V3 a -> V3 a -- | axisAngle axis theta builds a Quaternion -- representing a rotation of theta radians about axis. axisAngle :: (Epsilon a, Floating a) => V3 a -> a -> Quaternion a instance Typeable1 Quaternion instance Eq a => Eq (Quaternion a) instance Ord a => Ord (Quaternion a) instance Read a => Read (Quaternion a) instance Show a => Show (Quaternion a) instance Data a => Data (Quaternion a) instance (RealFloat a, Epsilon a) => Epsilon (Quaternion a) instance RealFloat a => Floating (Quaternion a) instance (Conjugate a, RealFloat a) => Conjugate (Quaternion a) instance Distributive Quaternion instance Hamiltonian Quaternion instance Complicated Quaternion instance Complicated Complex instance Metric Quaternion instance RealFloat a => Fractional (Quaternion a) instance RealFloat a => Num (Quaternion a) instance Storable a => Storable (Quaternion a) instance Traversable Quaternion instance Foldable Quaternion instance Core Quaternion instance Ix a => Ix (Quaternion a) instance Monad Quaternion instance Bind Quaternion instance Additive Quaternion instance Applicative Quaternion instance Apply Quaternion instance Functor Quaternion -- | Simple matrix operation for low-dimensional primitives. module Linear.Matrix -- | Matrix product. This can compute mixed dense-dense, sparse-dense and -- sparse-sparse matrix products. -- --
--   >>> V2 (V3 1 2 3) (V3 4 5 6) !*! V3 (V2 1 2) (V2 3 4) (V2 4 5)
--   V2 (V2 19 25) (V2 43 58)
--   
-- --
--   >>> V2 (fromList [(1,2)]) (fromList [(2,3)]) !*! fromList [(1,V3 0 0 1), (2, V3 0 0 5)]
--   V2 (V3 0 0 2) (V3 0 0 15)
--   
(!*!) :: (Functor m, Foldable r, Apply r, Distributive n, Num a) => m (r a) -> r (n a) -> m (n a) -- | Matrix * column vector -- --
--   >>> V2 (V3 1 2 3) (V3 4 5 6) !* V3 7 8 9
--   V2 50 122
--   
(!*) :: (Functor m, Metric r, Num a) => m (r a) -> r a -> m a -- | Row vector * matrix -- --
--   >>> V2 1 2 *! V2 (V3 3 4 5) (V3 6 7 8)
--   V3 15 18 21
--   
(*!) :: (Metric r, Distributive n, Num a) => r a -> r (n a) -> n a -- | Matrix-scalar product -- --
--   >>> V2 (V2 1 2) (V2 3 4) !!* 5
--   V2 (V2 5 10) (V2 15 20)
--   
(!!*) :: (Functor m, Functor r, Num a) => m (r a) -> a -> m (r a) -- | Scalar-matrix product -- --
--   >>> 5 *!! V2 (V2 1 2) (V2 3 4)
--   V2 (V2 5 10) (V2 15 20)
--   
(*!!) :: (Functor m, Functor r, Num a) => a -> m (r a) -> m (r a) -- | Hermitian conjugate or conjugate transpose -- --
--   >>> adjoint (V2 (V2 (1 :+ 2) (3 :+ 4)) (V2 (5 :+ 6) (7 :+ 8)))
--   V2 (V2 (1.0 :+ (-2.0)) (5.0 :+ (-6.0))) (V2 (3.0 :+ (-4.0)) (7.0 :+ (-8.0)))
--   
adjoint :: (Functor m, Distributive n, Conjugate a) => m (n a) -> n (m a) -- | A 2x2 matrix with row-major representation type M22 a = V2 (V2 a) -- | A 3x3 matrix with row-major representation type M33 a = V3 (V3 a) -- | A 4x4 matrix with row-major representation type M44 a = V4 (V4 a) -- | A 4x3 matrix with row-major representation type M43 a = V4 (V3 a) -- | Convert a 3x3 matrix to a 4x4 matrix extending it with 0's in the new -- row and column. m33_to_m44 :: Num a => M33 a -> M44 a -- | Convert from a 4x3 matrix to a 4x4 matrix, extending it with the [ -- 0 0 0 1 ] column vector m43_to_m44 :: Num a => M43 a -> M44 a -- | 2x2 matrix determinant. -- --
--   >>> det22 (V2 (V2 a b) (V2 c d))
--   a * d - b * c
--   
det22 :: Num a => M22 a -> a -- | 3x3 matrix determinant. -- --
--   >>> det33 (V3 (V3 a b c) (V3 d e f) (V3 g h i))
--   a * (e * i - f * h) - d * (b * i - c * h) + g * (b * f - c * e)
--   
det33 :: Num a => M33 a -> a -- | 2x2 matrix inverse. -- --
--   >>> inv22 $ V2 (V2 1 2) (V2 3 4)
--   Just (V2 (V2 (-2.0) 1.0) (V2 1.5 (-0.5)))
--   
inv22 :: (Epsilon a, Floating a) => M22 a -> Maybe (M22 a) -- | 3x3 matrix inverse. -- --
--   >>> inv33 $ V3 (V3 1 2 4) (V3 4 2 2) (V3 1 1 1)
--   Just (V3 (V3 0.0 0.5 (-1.0)) (V3 (-0.5) (-0.75) 3.5) (V3 0.5 0.25 (-1.5)))
--   
inv33 :: (Epsilon a, Floating a) => M33 a -> Maybe (M33 a) -- | 3x3 identity matrix. -- --
--   >>> eye3
--   V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)
--   
eye3 :: Num a => M33 a -- | 4x4 identity matrix. -- --
--   >>> eye4
--   V4 (V4 1 0 0 0) (V4 0 1 0 0) (V4 0 0 1 0) (V4 0 0 0 1)
--   
eye4 :: Num a => M44 a -- | Compute the trace of a matrix -- --
--   >>> trace (V2 (V2 a b) (V2 c d))
--   a + d
--   
trace :: (Monad f, Foldable f, Num a) => f (f a) -> a -- | Extract the translation vector (first three entries of the last -- column) from a 3x4 or 4x4 matrix translation :: (R3 t, R4 v, Functor f, Functor t) => (V3 a -> f (V3 a)) -> t (v a) -> f (t a) -- | Build a rotation matrix from a unit Quaternion. fromQuaternion :: Num a => Quaternion a -> M33 a -- | Build a transformation matrix from a rotation expressed as a -- Quaternion and a translation vector. mkTransformation :: Num a => Quaternion a -> V3 a -> M44 a -- | This module simply re-exports everything from the various modules that -- make up the linear package. module Linear