Data.Vec.Base
 Contents Vector Types List-like functions Matrix Types
Synopsis
data a :. b = !a :. !b
class ShowVec v where
 showVec :: v -> String
type Vec2 a = a :. (a :. ())
type Vec3 a = a :. Vec2 a
type Vec4 a = a :. Vec3 a
type Vec5 a = a :. Vec4 a
type Vec6 a = a :. Vec5 a
type Vec7 a = a :. Vec6 a
type Vec8 a = a :. Vec7 a
type Vec9 a = a :. Vec8 a
type Vec10 a = a :. Vec9 a
type Vec11 a = a :. Vec10 a
type Vec12 a = a :. Vec11 a
type Vec13 a = a :. Vec12 a
type Vec14 a = a :. Vec13 a
type Vec15 a = a :. Vec14 a
type Vec16 a = a :. Vec15 a
type Vec17 a = a :. Vec16 a
type Vec18 a = a :. Vec17 a
type Vec19 a = a :. Vec18 a
class Vec n a v | n a -> v, v -> n a where
 mkVec :: n -> a -> v fromList :: [a] -> v getElem :: Int -> v -> a setElem :: Int -> a -> v -> v
vec :: Vec n a v => a -> v
class Access n a v | v -> a where
 get :: n -> v -> a set :: n -> a -> v -> v
class Head v a | v -> a where
class Tail v v_ | v -> v_ where
 tail :: v -> v_
class Map a b u v | u -> a, v -> b, b u -> v, a v -> u where
 map :: (a -> b) -> u -> v
class ZipWith a b c u v w | u -> a, v -> b, w -> c, u v c -> w where
 zipWith :: (a -> b -> c) -> u -> v -> w
class Fold a v | v -> a where
 fold :: (a -> a -> a) -> v -> a foldl :: (b -> a -> b) -> b -> v -> b foldr :: (a -> b -> b) -> b -> v -> b
class Reverse' p v v' | p v -> v' where
 reverse' :: p -> v -> v'
class Append v1 v2 v3 | v1 v2 -> v3, v1 v3 -> v2 where
 append :: v1 -> v2 -> v3
class Take n v v' | n v -> v', n v' -> v where
 take :: n -> v -> v'
class Drop n v v' | n v -> v', n v' -> v where
 drop :: n -> v -> v'
class Last v a | v -> a where
 last :: v -> a
class Snoc v a v' | v a -> v', v' -> v a where
 snoc :: v -> a -> v'
sum :: (Fold a v, Num a) => v -> a
product :: (Fold a v, Num a) => v -> a
maximum :: (Fold a v, Ord a) => v -> a
minimum :: (Fold a v, Ord a) => v -> a
toList :: Fold a v => v -> [a]
type Mat22 a = Vec2 (Vec2 a)
type Mat23 a = Vec2 (Vec3 a)
type Mat24 a = Vec2 (Vec4 a)
type Mat32 a = Vec3 (Vec2 a)
type Mat33 a = Vec3 (Vec3 a)
type Mat34 a = Vec3 (Vec4 a)
type Mat35 a = Vec3 (Vec5 a)
type Mat36 a = Vec3 (Vec6 a)
type Mat42 a = Vec4 (Vec2 a)
type Mat43 a = Vec4 (Vec3 a)
type Mat44 a = Vec4 (Vec4 a)
type Mat45 a = Vec4 (Vec5 a)
type Mat46 a = Vec4 (Vec6 a)
type Mat47 a = Vec4 (Vec7 a)
type Mat48 a = Vec4 (Vec8 a)
matToLists :: (Fold a v, Fold v m) => m -> [[a]]
matToList :: (Fold a v, Fold v m) => m -> [a]
matFromLists :: (Vec j a v, Vec i v m) => [[a]] -> m
matFromList :: forall i j v m a. (Vec i v m, Vec j a v, Nat i) => [a] -> m
Documentation
 data a :. b Source
The vector constructor. (:.) for vectors is like (:) for lists, and () takes the place of []. (The list of instances here is not meant to be readable.)
Constructors
 !a :. !b
Instances
 ZipWith a b c (a' :. u) (b' :. v) (c' :. w) => ZipWith a b c (a :. (a' :. u)) (b :. (b' :. v)) (c :. (c' :. w)) ZipWith a b c (a :. (a :. as)) (b :. ()) (c :. ()) ZipWith a b c (a :. ()) (b :. (b :. bs)) (c :. ()) ZipWith a b c (a :. ()) (b :. ()) (c :. ()) Snoc () a (a :. ()) Access N0 a (a :. v) Vec N1 a (a :. ()) Alternating N1 a (a :. ()) (Access n a r, Append p (a :. ()) p', GetDiagonal' (Succ n) p' (r :. m) v) => GetDiagonal' n p (r :. (r :. m)) v Map a b (a' :. u) (b' :. v) => Map a b (a :. (a' :. u)) (b :. (b' :. v)) Map a b (a :. ()) (b :. ()) (Append p (a :. v) x, Append p (a :. ()) y, ReplConsec' a y v z) => ReplConsec' a p (a :. v) (x :. z) (Access n a r, Append p (a :. ()) (a :. p)) => GetDiagonal' n p (r :. ()) (a :. p) PackedVec Vec4D (Vec4 Double) PackedVec Vec3D (Vec3 Double) PackedVec Vec2D (Vec2 Double) PackedVec Vec4F (Vec4 Float) PackedVec Vec3F (Vec3 Float) PackedVec Vec2F (Vec2 Float) PackedVec Vec4I (Vec4 Int) PackedVec Vec3I (Vec3 Int) PackedVec Vec2I (Vec2 Int) Fold a (a' :. u) => Fold a (a :. (a' :. u)) Fold a (a :. ()) (Fractional a, Map (a :. r) r ((a :. r) :. rs) rs_, Map r (a :. r) rs_ ((a :. r) :. rs), Pivot a ((a :. r) :. ((a :. r) :. rs)), GaussElim a rs_) => GaussElim a ((a :. r) :. ((a :. r) :. rs)) (Num a, Pivot a (r :. ())) => GaussElim a (r :. ()) (Fractional a, NearZero a, Pivot1 a rs, Tail (a :. r) r, Map (a :. r) r ((a :. r) :. rs) (r :. rs'), Map r (a :. r) (r :. rs') ((a :. r) :. rs), Pivot1 a ((a :. r) :. rs), Pivot a (r :. rs')) => Pivot a ((a :. r) :. rs) Pivot a (() :. v) (Fractional a, NearZero a, Map a a (a :. r) (a :. r), ZipWith a a a (a :. r) (a :. r) (a :. r), Map (a :. r) (a :. r) ((a :. r) :. rs) ((a :. r) :. rs), Pivot1 a ((a :. r) :. rs)) => Pivot1 a ((a :. r) :. ((a :. r) :. rs)) (Fractional a, NearZero a, Map a a (a :. r) (a :. r)) => Pivot1 a ((a :. (a :. r)) :. ()) (Fractional a, NearZero a) => Pivot1 a ((a :. ()) :. ()) (Num a, Num (a :. (a :. (a :. v))), Fold a (a :. (a :. (a :. v))), Alternating (Succ (Succ (Succ n))) a (a :. (a :. (a :. v))), DropConsec (a :. (a :. (a :. v))) vv, Map (a :. (a :. (a :. v))) vv ((a :. (a :. (a :. v))) :. ((a :. (a :. (a :. v))) :. m)) vmt, Transpose vmt vm, Map ((a :. (a :. v)) :. ((a :. (a :. v)) :. m_)) a vm (a :. (a :. (a :. v))), Det' a ((a :. (a :. v)) :. ((a :. (a :. v)) :. m_)), Vec (Succ (Succ (Succ n))) a (a :. (a :. (a :. v))), Vec (Succ (Succ (Succ n))) (a :. (a :. (a :. v))) ((a :. (a :. (a :. v))) :. ((a :. (a :. (a :. v))) :. ((a :. (a :. (a :. v))) :. m)))) => Det' a ((a :. (a :. (a :. v))) :. ((a :. (a :. (a :. v))) :. ((a :. (a :. (a :. v))) :. m))) Num a => Det' a ((a :. (a :. ())) :. ((a :. (a :. ())) :. ())) Reverse' (a :. p) v v' => Reverse' p (a :. v) v' (Append p (a :. v) x, Append p (a :. ()) y, DropConsec' y (a :. v) z) => DropConsec' p (a :. (a :. v)) (x :. z) DropConsec' p (a :. ()) (p :. ()) (SetDiagonal' (Succ n) v m, Access n a r) => SetDiagonal' n (a :. v) (r :. m) Access n a v => Access (Succ n) a (a :. v) Vec (Succ n) a (a' :. v) => Vec (Succ (Succ n)) a (a :. (a' :. v)) (Num a, Alternating n a (a :. v)) => Alternating (Succ n) a (a :. (a :. v)) Take n v v' => Take (Succ n) (a :. v) (a :. v') (Eq a, Eq b) => Eq (a :. b) (Fractional a, Ord (a :. u), ZipWith a a a (a :. u) (a :. u) (a :. u), Map a a (a :. u) (a :. u), Vec (Succ l) a (a :. u), Show (a :. u)) => Fractional (a :. u) (Eq (a :. u), Show (a :. u), Num a, Map a a (a :. u) (a :. u), ZipWith a a a (a :. u) (a :. u) (a :. u), Vec (Succ l) a (a :. u)) => Num (a :. u) (Ord a, Ord b) => Ord (a :. b) (Read a, Read b) => Read (a :. b) (Show a, ShowVec v) => Show (a :. v) (Vec (Succ (Succ n)) a (a :. (a :. v)), Storable a, Storable (a :. v)) => Storable (a :. (a :. v)) Storable a => Storable (a :. ()) (Show a, ShowVec v) => ShowVec (a :. v) (Map (a :. r) r ((a :. r) :. rs) rs_, Map r (a :. r) rs_ ((a :. r) :. rs), Fold ((,) a (a :. r)) aas, ZipWith a a a (a :. r) (a :. r) (a :. r), Map a a (a :. r) (a :. r), ZipWith a (a :. r) ((,) a (a :. r)) r ((a :. r) :. rs) aas, Num a, BackSubstitute' rs_) => BackSubstitute' ((a :. r) :. ((a :. r) :. rs)) BackSubstitute' ((a :. r) :. ()) (Map (a :. r) r ((a :. r) :. rs) rs_, Map r (a :. r) rs_ ((a :. r) :. rs), Fold ((,) a (a :. r)) aas, ZipWith a a a (a :. r) (a :. r) (a :. r), Map a a (a :. r) (a :. r), ZipWith a (a :. r) ((,) a (a :. r)) r ((a :. r) :. rs) aas, Num a, NearZero a, BackSubstitute rs_) => BackSubstitute ((a :. r) :. ((a :. r) :. rs)) BackSubstitute ((a :. r) :. ()) Last (a' :. v) a => Last (a :. (a' :. v)) a Last (a :. ()) a Tail (a :. as) as Head (a :. as) a Transpose' vs vs' => Transpose' (() :. vs) vs' Snoc v a (a :. v) => Snoc (a :. v) a (a :. (a :. v)) Append (a' :. v1) v2 v3 => Append (a :. (a' :. v1)) v2 (a :. v3) Append (a :. ()) v (a :. v) (Head xss_h xss_hh, Map xss_h xss_hh (xss_h :. xss_t) xs', Tail xss_h xss_ht, Map xss_h xss_ht (xss_h :. xss_t) xss_, Transpose' (xs :. xss_) xss') => Transpose' ((x :. xs) :. (xss_h :. xss_t)) ((x :. xs') :. xss') Transpose' ((x :. ()) :. ()) ((x :. ()) :. ()) (Vec (Succ n) s (s :. ra), Vec (Succ m) (s :. ra) ((s :. ra) :. a), Vec (Succ m) s (s :. rb), Vec (Succ n) (s :. rb) ((s :. rb) :. b), Transpose' ((s :. ra) :. a) ((s :. rb) :. b)) => Transpose ((s :. ra) :. a) ((s :. rb) :. b)
 class ShowVec v where Source
Helper to keep parentheses at bay. Just use show as usual.
Methods
 showVec :: v -> String Source
Instances
 ShowVec () (Show a, ShowVec v) => ShowVec (a :. v)
Vector Types
 type Vec2 a = a :. (a :. ()) Source
 type Vec3 a = a :. Vec2 a Source
 type Vec4 a = a :. Vec3 a Source
 type Vec5 a = a :. Vec4 a Source
 type Vec6 a = a :. Vec5 a Source
 type Vec7 a = a :. Vec6 a Source
 type Vec8 a = a :. Vec7 a Source
 type Vec9 a = a :. Vec8 a Source
 type Vec10 a = a :. Vec9 a Source
 type Vec11 a = a :. Vec10 a Source
 type Vec12 a = a :. Vec11 a Source
 type Vec13 a = a :. Vec12 a Source
 type Vec14 a = a :. Vec13 a Source
 type Vec15 a = a :. Vec14 a Source
 type Vec16 a = a :. Vec15 a Source
 type Vec17 a = a :. Vec16 a Source
 type Vec18 a = a :. Vec17 a Source
 type Vec19 a = a :. Vec18 a Source
 class Vec n a v | n a -> v, v -> n a where Source
The type constraint Vec n a v infers the vector type v from the length n, a type-level natural, and underlying component type a. So x :: Vec N4 a v => v declares x to be a 4-vector of as.
Methods
 mkVec :: n -> a -> v Source
Make a uniform vector of a given length. n is a type-level natural. Use vec when the length can be inferred.
 fromList :: [a] -> v Source
turn a list into a vector of inferred length
 getElem :: Int -> v -> a Source
get a vector element, which one is determined at runtime
 setElem :: Int -> a -> v -> v Source
set a vector element, which one is determined at runtime
Instances
 Vec N1 a (a :. ()) Vec N1 a (a :. ()) Vec (Succ n) a (a' :. v) => Vec (Succ (Succ n)) a (a :. (a' :. v)) Vec (Succ n) a (a' :. v) => Vec (Succ (Succ n)) a (a :. (a' :. v))
 vec :: Vec n a v => a -> v Source
Make a uniform vector. The length is inferred.
 class Access n a v | v -> a where Source
get or set a vector element, known at compile time. Use the Nat types to access vector components. For instance, get n0 gets the x component, set n2 44 sets the z component to 44.
Methods
 get :: n -> v -> a Source
 set :: n -> a -> v -> v Source
Instances
 Access N0 a (a :. v) Access N0 a (a :. v) Access n a v => Access (Succ n) a (a :. v) Access n a v => Access (Succ n) a (a :. v)
List-like functions
 class Head v a | v -> a where Source
The first element.
Methods
 head :: v -> a Source
Instances
 class Tail v v_ | v -> v_ where Source
All but the first element.
Methods
 tail :: v -> v_ Source
Instances
 Tail (a :. as) as
 class Map a b u v | u -> a, v -> b, b u -> v, a v -> u where Source
Apply a function over each element in a vector. Constraint Map a b u v states that u is a vector of as, v is a vector of bs with the same length as u, and the function is of type a -> b.
Methods
 map :: (a -> b) -> u -> v Source
Instances
 Map a b (a' :. u) (b' :. v) => Map a b (a :. (a' :. u)) (b :. (b' :. v)) Map a b (a :. ()) (b :. ())
 class ZipWith a b c u v w | u -> a, v -> b, w -> c, u v c -> w where Source
Combine two vectors using a binary function. The length of the result is the min of the lengths of the arguments. The constraint ZipWith a b c u v w states that u is a vector of as, v is a vector of bs, w is a vector of cs, and the binary function is of type a -> b -> c.
Methods
 zipWith :: (a -> b -> c) -> u -> v -> w Source
Instances
 ZipWith a b c (a' :. u) (b' :. v) (c' :. w) => ZipWith a b c (a :. (a' :. u)) (b :. (b' :. v)) (c :. (c' :. w)) ZipWith a b c (a :. (a :. as)) (b :. ()) (c :. ()) ZipWith a b c (a :. ()) (b :. (b :. bs)) (c :. ()) ZipWith a b c (a :. ()) (b :. ()) (c :. ())
 class Fold a v | v -> a where Source
Fold a function over a vector.
Methods
 fold :: (a -> a -> a) -> v -> a Source
 foldl :: (b -> a -> b) -> b -> v -> b Source
 foldr :: (a -> b -> b) -> b -> v -> b Source
Instances
 Fold a (a' :. u) => Fold a (a :. (a' :. u)) Fold a (a :. ())
 class Reverse' p v v' | p v -> v' where Source
Methods
 reverse' :: p -> v -> v' Source
Instances
 Reverse' p () p Reverse' (a :. p) v v' => Reverse' p (a :. v) v'
 class Append v1 v2 v3 | v1 v2 -> v3, v1 v3 -> v2 where Source
Append two vectors
Methods
 append :: v1 -> v2 -> v3 Source
Instances
 Append () v v Append (a' :. v1) v2 v3 => Append (a :. (a' :. v1)) v2 (a :. v3) Append (a :. ()) v (a :. v)
 class Take n v v' | n v -> v', n v' -> v where Source
take n v constructs a vector from the first n elements of v. n is a type-level natural. For example take n3 v makes a 3-vector of the first three elements of v.
Methods
 take :: n -> v -> v' Source
Instances
 Take N0 v () Take N0 v () Take n v v' => Take (Succ n) (a :. v) (a :. v') Take n v v' => Take (Succ n) (a :. v) (a :. v')
 class Drop n v v' | n v -> v', n v' -> v where Source
drop n v strips the first n elements from v. n is a type-level natural. For example drop n2 v drops the first two elements.
Methods
 drop :: n -> v -> v' Source
Instances
 Drop N0 v v (Tail v' v'', Drop n v v') => Drop (Succ n) v v''
 class Last v a | v -> a where Source
Get the last element, usually significant for some reason (quaternions, homogenous coordinates, whatever)
Methods
 last :: v -> a Source
Instances
 Last (a' :. v) a => Last (a :. (a' :. v)) a Last (a :. ()) a
 class Snoc v a v' | v a -> v', v' -> v a where Source
snoc v a appends the element a to the end of v.
Methods
 snoc :: v -> a -> v' Source
Instances
 Snoc () a (a :. ()) Snoc () a (a :. ()) Snoc v a (a :. v) => Snoc (a :. v) a (a :. (a :. v))
 sum :: (Fold a v, Num a) => v -> a Source
sum of vector elements
 product :: (Fold a v, Num a) => v -> a Source
product of vector elements
 maximum :: (Fold a v, Ord a) => v -> a Source
maximum vector element
 minimum :: (Fold a v, Ord a) => v -> a Source
minimum vector element
 toList :: Fold a v => v -> [a] Source
Matrix Types
 type Mat22 a = Vec2 (Vec2 a) Source
 type Mat23 a = Vec2 (Vec3 a) Source
 type Mat24 a = Vec2 (Vec4 a) Source
 type Mat32 a = Vec3 (Vec2 a) Source
 type Mat33 a = Vec3 (Vec3 a) Source
 type Mat34 a = Vec3 (Vec4 a) Source
 type Mat35 a = Vec3 (Vec5 a) Source
 type Mat36 a = Vec3 (Vec6 a) Source
 type Mat42 a = Vec4 (Vec2 a) Source
 type Mat43 a = Vec4 (Vec3 a) Source
 type Mat44 a = Vec4 (Vec4 a) Source
 type Mat45 a = Vec4 (Vec5 a) Source
 type Mat46 a = Vec4 (Vec6 a) Source
 type Mat47 a = Vec4 (Vec7 a) Source
 type Mat48 a = Vec4 (Vec8 a) Source
 matToLists :: (Fold a v, Fold v m) => m -> [[a]] Source
convert a matrix to a list-of-lists
 matToList :: (Fold a v, Fold v m) => m -> [a] Source
convert a matrix to a list in row-major order
 matFromLists :: (Vec j a v, Vec i v m) => [[a]] -> m Source
convert a list-of-lists into a matrix
 matFromList :: forall i j v m a. (Vec i v m, Vec j a v, Nat i) => [a] -> m Source
convert a list into a matrix. (row-major order)