| Safe Haskell | None |
|---|
Data.Vector.Fixed
Contents
Description
Generic API for vectors with fixed length.
For encoding of vector size library uses Peano naturals defined in the library. At come point in the future it would make sense to switch to new GHC type level numerals.
- type family Dim v
- data Z
- data S n
- type N1 = S Z
- type N2 = S N1
- type N3 = S N2
- type N4 = S N3
- type N5 = S N4
- type N6 = S N5
- class Arity (Dim v) => Vector v a where
- class (Vector (v n) a, Dim (v n) ~ n) => VectorN v n a
- class Arity n
- newtype Fun n a b = Fun (Fn n a b)
- length :: forall v a. Arity (Dim v) => v a -> Int
- mk1 :: (Vector v a, Dim v ~ N1) => a -> v a
- mk2 :: (Vector v a, Dim v ~ N2) => a -> a -> v a
- mk3 :: (Vector v a, Dim v ~ N3) => a -> a -> a -> v a
- mk4 :: (Vector v a, Dim v ~ N4) => a -> a -> a -> a -> v a
- mk5 :: (Vector v a, Dim v ~ N5) => a -> a -> a -> a -> a -> v a
- data New n v a
- vec :: New Z v a -> v a
- con :: Vector v a => New (Dim v) v a
- (|>) :: New (S n) v a -> a -> New n v a
- replicate :: Vector v a => a -> v a
- replicateM :: (Vector v a, Monad m) => m a -> m (v a)
- generate :: Vector v a => (Int -> a) -> v a
- generateM :: (Monad m, Vector v a) => (Int -> m a) -> m (v a)
- unfoldr :: Vector v a => (b -> (a, b)) -> b -> v a
- basis :: (Vector v a, Num a) => Int -> v a
- head :: (Vector v a, Dim v ~ S n) => v a -> a
- tail :: (Vector v a, Vector w a, Dim v ~ S (Dim w)) => v a -> w a
- (!) :: Vector v a => v a -> Int -> a
- eq :: (Vector v a, Eq a) => v a -> v a -> Bool
- map :: (Vector v a, Vector v b) => (a -> b) -> v a -> v b
- mapM :: (Vector v a, Vector v b, Monad m) => (a -> m b) -> v a -> m (v b)
- mapM_ :: (Vector v a, Monad m) => (a -> m b) -> v a -> m ()
- imap :: (Vector v a, Vector v b) => (Int -> a -> b) -> v a -> v b
- imapM :: (Vector v a, Vector v b, Monad m) => (Int -> a -> m b) -> v a -> m (v b)
- imapM_ :: (Vector v a, Monad m) => (Int -> a -> m b) -> v a -> m ()
- sequence :: (Vector v a, Vector v (m a), Monad m) => v (m a) -> m (v a)
- sequence_ :: (Vector v (m a), Monad m) => v (m a) -> m ()
- foldl :: Vector v a => (b -> a -> b) -> b -> v a -> b
- foldr :: Vector v a => (a -> b -> b) -> b -> v a -> b
- foldl1 :: (Vector v a, Dim v ~ S n) => (a -> a -> a) -> v a -> a
- ifoldl :: Vector v a => (b -> Int -> a -> b) -> b -> v a -> b
- ifoldr :: Vector v a => (Int -> a -> b -> b) -> b -> v a -> b
- foldM :: (Vector v a, Monad m) => (b -> a -> m b) -> b -> v a -> m b
- ifoldM :: (Vector v a, Monad m) => (b -> Int -> a -> m b) -> b -> v a -> m b
- sum :: (Vector v a, Num a) => v a -> a
- maximum :: (Vector v a, Dim v ~ S n, Ord a) => v a -> a
- minimum :: (Vector v a, Dim v ~ S n, Ord a) => v a -> a
- and :: Vector v Bool => v Bool -> Bool
- or :: Vector v Bool => v Bool -> Bool
- all :: Vector v a => (a -> Bool) -> v a -> Bool
- any :: Vector v a => (a -> Bool) -> v a -> Bool
- zipWith :: (Vector v a, Vector v b, Vector v c) => (a -> b -> c) -> v a -> v b -> v c
- zipWithM :: (Vector v a, Vector v b, Vector v c, Monad m) => (a -> b -> m c) -> v a -> v b -> m (v c)
- izipWith :: (Vector v a, Vector v b, Vector v c) => (Int -> a -> b -> c) -> v a -> v b -> v c
- izipWithM :: (Vector v a, Vector v b, Vector v c, Monad m) => (Int -> a -> b -> m c) -> v a -> v b -> m (v c)
- convert :: (Vector v a, Vector w a, Dim v ~ Dim w) => v a -> w a
- toList :: Vector v a => v a -> [a]
- fromList :: Vector v a => [a] -> v a
- data VecList n a
Vector type class
Vector size
Synonyms for small numerals
Type class
class Arity (Dim v) => Vector v a whereSource
Type class for vectors with fixed length.
Methods
construct :: Fun (Dim v) a (v a)Source
N-ary function for creation of vectors.
inspect :: v a -> Fun (Dim v) a b -> bSource
Deconstruction of vector.
basicIndex :: v a -> Int -> aSource
Optional more efficient implementation of indexing. Shouldn't
be used directly, use ! instead.
Instances
| RealFloat a => Vector Complex a | |
| ~ * b a => Vector ((,) b) a | |
| Arity n => Vector (VecList n) a | |
| Arity n => Vector (Vec n) a | |
| (Arity n, Prim a) => Vector (Vec n) a | |
| Unbox n a => Vector (Vec n) a | |
| (Arity n, Storable a) => Vector (Vec n) a | |
| (~ * b a, ~ * c a) => Vector ((,,) b c) a | |
| (~ * b a, ~ * c a, ~ * d a) => Vector ((,,,) b c d) a | |
| (~ * b a, ~ * c a, ~ * d a, ~ * e a) => Vector ((,,,,) b c d e) a | |
| (~ * b a, ~ * c a, ~ * d a, ~ * e a, ~ * f a) => Vector ((,,,,,) b c d e f) a | |
| (~ * b a, ~ * c a, ~ * d a, ~ * e a, ~ * f a, ~ * g a) => Vector ((,,,,,,) b c d e f g) a |
class (Vector (v n) a, Dim (v n) ~ n) => VectorN v n a Source
Vector parametrized by length. In ideal world it should be:
forall n. (Arity n, Vector (v n) a, Dim (v n) ~ n) => VectorN v a
Alas polymorphic constraints aren't allowed in haskell.
Type class for handling n-ary functions.
Newtype wrapper which is used to make Fn injective.
length :: forall v a. Arity (Dim v) => v a -> IntSource
Length of vector. Function doesn't evaluate its argument.
Constructors
Small dimensions
Constructors for vectors with small dimensions.
Generic constructor
Generic function for construction of arbitrary vectors. It represents partially constructed vector where n is number of uninitialized elements, v is type of vector and a element type.
Uninitialized vector could be obtained from con and vector
elements could be added from left to right using |> operator.
Finally it could be converted to vector using vec function.
Construction of complex number which could be seen as 2-element vector:
>>>import Data.Complex>>>vec $ con |> 1 |> 3 :: Complex Double1.0 :+ 3.0
Functions
replicate :: Vector v a => a -> v aSource
Replicate value n times.
Examples:
>>>import Data.Vector.Fixed.Boxed (Vec2)>>>replicate 1 :: Vec2 IntfromList [1,1]
>>>replicate 2 :: (Double,Double,Double)(2.0,2.0,2.0)
>>>import Data.Vector.Fixed.Boxed (Vec)>>>replicate "foo" :: Vec N5 StringfromList ["foo","foo","foo","foo","foo"]
replicateM :: (Vector v a, Monad m) => m a -> m (v a)Source
Execute monadic action for every element of vector.
Examples:
>>>import Data.Vector.Fixed.Boxed (Vec2,Vec3)>>>replicateM (Just 3) :: Maybe (Vec3 Int)Just fromList [3,3,3]>>>replicateM (putStrLn "Hi!") :: IO (Vec2 ())Hi! Hi! fromList [(),()]
generate :: Vector v a => (Int -> a) -> v aSource
Generate vector from function which maps element's index to its value.
Examples:
>>>import Data.Vector.Fixed.Unboxed (Vec)>>>generate (^2) :: Vec N4 IntfromList [0,1,4,9]
generateM :: (Monad m, Vector v a) => (Int -> m a) -> m (v a)Source
Generate vector from monadic function which maps element's index to its value.
basis :: (Vector v a, Num a) => Int -> v aSource
Unit vector along Nth axis. If index is larger than vector dimensions returns zero vector.
Examples:
>>>import Data.Vector.Fixed.Boxed (Vec3)>>>basis 0 :: Vec3 IntfromList [1,0,0]>>>basis 1 :: Vec3 IntfromList [0,1,0]>>>basis 3 :: Vec3 IntfromList [0,0,0]
Modifying vectors
Transformations
head :: (Vector v a, Dim v ~ S n) => v a -> aSource
First element of vector.
Examples:
>>>import Data.Vector.Fixed.Boxed (Vec3)>>>let x = mk3 1 2 3 :: Vec3 Int>>>head x1
tail :: (Vector v a, Vector w a, Dim v ~ S (Dim w)) => v a -> w aSource
Tail of vector.
Examples:
>>>import Data.Complex>>>tail (1,2,3) :: Complex Double2.0 :+ 3.0
(!) :: Vector v a => v a -> Int -> aSource
Retrieve vector's element at index. Generic implementation is O(n) but more efficient one is used when possible.
Comparison
eq :: (Vector v a, Eq a) => v a -> v a -> BoolSource
Test two vectors for equality.
Examples:
>>>import Data.Vector.Fixed.Boxed (Vec2)>>>let v0 = basis 0 :: Vec2 Int>>>let v1 = basis 1 :: Vec2 Int>>>v0 `eq` v0True>>>v0 `eq` v1False
Maps
mapM :: (Vector v a, Vector v b, Monad m) => (a -> m b) -> v a -> m (v b)Source
Monadic map over vector.
mapM_ :: (Vector v a, Monad m) => (a -> m b) -> v a -> m ()Source
Apply monadic action to each element of vector and ignore result.
imap :: (Vector v a, Vector v b) => (Int -> a -> b) -> v a -> v bSource
Apply function to every element of the vector and its index.
imapM :: (Vector v a, Vector v b, Monad m) => (Int -> a -> m b) -> v a -> m (v b)Source
Apply monadic function to every element of the vector and its index.
imapM_ :: (Vector v a, Monad m) => (Int -> a -> m b) -> v a -> m ()Source
Apply monadic function to every element of the vector and its index and discard result.
sequence :: (Vector v a, Vector v (m a), Monad m) => v (m a) -> m (v a)Source
Evaluate every action in the vector from left to right.
sequence_ :: (Vector v (m a), Monad m) => v (m a) -> m ()Source
Evaluate every action in the vector from left to right and ignore result
Folding
ifoldl :: Vector v a => (b -> Int -> a -> b) -> b -> v a -> bSource
Left fold over vector. Function is applied to each element and its index.
ifoldM :: (Vector v a, Monad m) => (b -> Int -> a -> m b) -> b -> v a -> m bSource
Left monadic fold over vector. Function is applied to each element and its index.
Special folds
maximum :: (Vector v a, Dim v ~ S n, Ord a) => v a -> aSource
Maximal element of vector.
Examples:
>>>import Data.Vector.Fixed.Boxed (Vec3)>>>let x = mk3 1 2 3 :: Vec3 Int>>>maximum x3
minimum :: (Vector v a, Dim v ~ S n, Ord a) => v a -> aSource
Minimal element of vector.
Examples:
>>>import Data.Vector.Fixed.Boxed (Vec3)>>>let x = mk3 1 2 3 :: Vec3 Int>>>minimum x1
all :: Vector v a => (a -> Bool) -> v a -> BoolSource
Determines whether all elements of vector satisfy predicate.
any :: Vector v a => (a -> Bool) -> v a -> BoolSource
Determines whether any of element of vector satisfy predicate.
Zips
zipWith :: (Vector v a, Vector v b, Vector v c) => (a -> b -> c) -> v a -> v b -> v cSource
Zip two vector together using function.
Examples:
>>>import Data.Vector.Fixed.Boxed (Vec3)>>>let b0 = basis 0 :: Vec3 Int>>>let b1 = basis 1 :: Vec3 Int>>>let b2 = basis 2 :: Vec3 Int>>>let vplus x y = zipWith (+) x y>>>vplus b0 b1fromList [1,1,0]>>>vplus b0 b2fromList [1,0,1]>>>vplus b1 b2fromList [0,1,1]
zipWithM :: (Vector v a, Vector v b, Vector v c, Monad m) => (a -> b -> m c) -> v a -> v b -> m (v c)Source
Zip two vector together using monadic function.
izipWith :: (Vector v a, Vector v b, Vector v c) => (Int -> a -> b -> c) -> v a -> v b -> v cSource
Zip two vector together using function which takes element index as well.
izipWithM :: (Vector v a, Vector v b, Vector v c, Monad m) => (Int -> a -> b -> m c) -> v a -> v b -> m (v c)Source
Zip two vector together using monadic function which takes element index as well..
Conversion
convert :: (Vector v a, Vector w a, Dim v ~ Dim w) => v a -> w aSource
Convert between different vector types
fromList :: Vector v a => [a] -> v aSource
Create vector form list. Will throw error if list is shorter than resulting vector.