Safe Haskell | None |
---|
API for Church-encoded vectors. Implementation of function from Data.Vector.Fixed module uses these function internally in order to provide shortcut fusion.
- data S n
- data Z
- type N1 = S Z
- type N2 = S N1
- type N3 = S N2
- type N4 = S N3
- type N5 = S N4
- type N6 = S N5
- type family Fn n a b
- newtype Fun n a b = Fun {}
- class Arity n where
- apply :: Arity n => (forall k. t (S k) -> (a, t k)) -> t n -> Fn n a b -> b
- applyM :: (Monad m, Arity n) => (forall k. t (S k) -> m (a, t k)) -> t n -> m (ContVec n a)
- apFun :: Fun (S n) a b -> a -> Fun n a b
- apLast :: Arity n => Fun (S n) a b -> a -> Fun n a b
- constFun :: Fun n a b -> Fun (S n) a b
- hideLast :: forall n a b. Arity n => Fun (S n) a b -> Fun n a (a -> b)
- shuffleFun :: forall n a b r. Arity n => (b -> Fun n a r) -> Fun n a (b -> r)
- type family Dim v
- class Arity (Dim v) => Vector v a where
- class (Vector (v n) a, Dim (v n) ~ n) => VectorN v n a
- length :: forall v a. Arity (Dim v) => v a -> Int
- class Index k n where
- newtype ContVec n a = ContVec (forall r. Fun n a r -> r)
- cvec :: (Vector v a, Dim v ~ n) => v a -> ContVec n a
- fromList :: forall n a. Arity n => [a] -> ContVec n a
- fromList' :: forall n a. Arity n => [a] -> ContVec n a
- fromListM :: forall n a. Arity n => [a] -> Maybe (ContVec n a)
- toList :: Arity n => ContVec n a -> [a]
- replicate :: forall n a. Arity n => a -> ContVec n a
- replicateM :: forall m n a. (Arity n, Monad m) => m a -> m (ContVec n a)
- generate :: forall n a. Arity n => (Int -> a) -> ContVec n a
- generateM :: forall m n a. (Monad m, Arity n) => (Int -> m a) -> m (ContVec n a)
- unfoldr :: forall n b a. Arity n => (b -> (a, b)) -> b -> ContVec n a
- basis :: forall n a. (Num a, Arity n) => Int -> ContVec n a
- empty :: ContVec Z a
- cons :: a -> ContVec n a -> ContVec (S n) a
- consV :: forall n a. ContVec (S Z) a -> ContVec n a -> ContVec (S n) a
- snoc :: Arity n => a -> ContVec n a -> ContVec (S n) a
- mk1 :: a -> ContVec N1 a
- mk2 :: a -> a -> ContVec N2 a
- mk3 :: a -> a -> a -> ContVec N3 a
- mk4 :: a -> a -> a -> a -> ContVec N4 a
- mk5 :: a -> a -> a -> a -> a -> ContVec N5 a
- map :: Arity n => (a -> b) -> ContVec n a -> ContVec n b
- imap :: Arity n => (Int -> a -> b) -> ContVec n a -> ContVec n b
- mapM :: (Arity n, Monad m) => (a -> m b) -> ContVec n a -> m (ContVec n b)
- imapM :: (Arity n, Monad m) => (Int -> a -> m b) -> ContVec n a -> m (ContVec n b)
- mapM_ :: (Arity n, Monad m) => (a -> m b) -> ContVec n a -> m ()
- imapM_ :: (Arity n, Monad m) => (Int -> a -> m b) -> ContVec n a -> m ()
- sequence :: (Arity n, Monad m) => ContVec n (m a) -> m (ContVec n a)
- sequence_ :: (Arity n, Monad m) => ContVec n (m a) -> m ()
- tail :: ContVec (S n) a -> ContVec n a
- reverse :: Arity n => ContVec n a -> ContVec n a
- zipWith :: Arity n => (a -> b -> c) -> ContVec n a -> ContVec n b -> ContVec n c
- izipWith :: Arity n => (Int -> a -> b -> c) -> ContVec n a -> ContVec n b -> ContVec n c
- zipWithM :: (Arity n, Monad m) => (a -> b -> m c) -> ContVec n a -> ContVec n b -> m (ContVec n c)
- izipWithM :: (Arity n, Monad m) => (Int -> a -> b -> m c) -> ContVec n a -> ContVec n b -> m (ContVec n c)
- runContVec :: Arity n => Fun n a r -> ContVec n a -> r
- head :: forall n a. Arity (S n) => ContVec (S n) a -> a
- index :: forall n a. Arity n => Int -> ContVec n a -> a
- element :: (Arity n, Functor f) => Int -> (a -> f a) -> ContVec n a -> f (ContVec n a)
- elementTy :: (Arity n, Index k n, Functor f) => k -> (a -> f a) -> ContVec n a -> f (ContVec n a)
- vector :: (Vector v a, Dim v ~ n) => ContVec n a -> v a
- foldl :: Arity n => (b -> a -> b) -> b -> ContVec n a -> b
- foldl1 :: forall n a. Arity (S n) => (a -> a -> a) -> ContVec (S n) a -> a
- foldr :: Arity n => (a -> b -> b) -> b -> ContVec n a -> b
- ifoldl :: forall n a b. Arity n => (b -> Int -> a -> b) -> b -> ContVec n a -> b
- ifoldr :: forall n a b. Arity n => (Int -> a -> b -> b) -> b -> ContVec n a -> b
- foldM :: (Arity n, Monad m) => (b -> a -> m b) -> b -> ContVec n a -> m b
- ifoldM :: (Arity n, Monad m) => (b -> Int -> a -> m b) -> b -> ContVec n a -> m b
- sum :: (Num a, Arity n) => ContVec n a -> a
- minimum :: (Ord a, Arity (S n)) => ContVec (S n) a -> a
- maximum :: (Ord a, Arity (S n)) => ContVec (S n) a -> a
- and :: Arity n => ContVec n Bool -> Bool
- or :: Arity n => ContVec n Bool -> Bool
- all :: Arity n => (a -> Bool) -> ContVec n a -> Bool
- any :: Arity n => (a -> Bool) -> ContVec n a -> Bool
Type-level numbers
Successor of n
Synonyms for small numerals
N-ary functions
Newtype wrapper which is used to make Fn
injective. It's also a
reader monad.
Type class for handling n-ary functions.
:: (forall k. t (S k) -> a -> t k) | Fold function |
-> (t Z -> b) | Extract result of fold |
-> t n | Initial value |
-> Fn n a b | Reduction function |
Left fold over n elements exposed as n-ary function. These elements are supplied as arguments to the function.
:: (forall k. t (S k) -> (a, t k)) | Get value to apply to function |
-> t n | Initial value |
-> Fn n a b | N-ary function |
-> (b, t Z) |
Apply all parameters to the function.
:: Monad m | |
=> (forall k. t (S k) -> m (a, t k)) | Get value to apply to function |
-> t n | Initial value |
-> m (ContVec n a, t Z) |
Apply all parameters to the function using monadic actions. Note that for identity monad it's same as applyFun. Ignoring newtypes:
forall b. Fn n a b -> b ~ ContVecn n a
Arity of function.
reverseF :: Fun n a b -> Fun n a bSource
Reverse order of parameters.
:: Arity n | |
=> (forall k. t (S k) -> (a, t k)) | Get value to apply to function |
-> t n | Initial value |
-> Fn n a b | N-ary function |
-> b |
Apply all parameters to the function.
:: (Monad m, Arity n) | |
=> (forall k. t (S k) -> m (a, t k)) | Get value to apply to function |
-> t n | Initial value |
-> m (ContVec n a) |
Apply all parameters to the function using monadic actions.
Combinators
hideLast :: forall n a b. Arity n => Fun (S n) a b -> Fun n a (a -> b)Source
Move last parameter into function result
shuffleFun :: forall n a b r. Arity n => (b -> Fun n a r) -> Fun n a (b -> r)Source
Move function parameter to the result of N-ary function.
Vector type class
class Arity (Dim v) => Vector v a whereSource
Type class for vectors with fixed length. Instance should provide two functions: one to create vector and another for vector deconstruction. They must obey following law:
inspect v construct = v
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.
RealFloat a => Vector Complex a | |
Vector Empty a | |
Vector Only a | |
~ * b a => Vector ((,) b) a | Note this instance (and other instances for tuples) is
essentially monomorphic in element type. Vector type v of 2
element tuple |
Arity n => Vector (ContVec n) 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.
length :: forall v a. Arity (Dim v) => v a -> IntSource
Length of vector. Function doesn't evaluate its argument.
Type class for indexing of vector when index value is known at compile time.
Vector as continuation
Vector represented as continuation. Alternative wording: it's Church encoded N-element vector.
Construction of ContVec
cvec :: (Vector v a, Dim v ~ n) => v a -> ContVec n aSource
Convert regular vector to continuation based one.
fromList :: forall n a. Arity n => [a] -> ContVec n aSource
Convert list to continuation-based vector. Will throw error if list is shorter than resulting vector.
fromList' :: forall n a. Arity n => [a] -> ContVec n aSource
Same as fromList
bu throws error is list doesn't have same
length as vector.
fromListM :: forall n a. Arity n => [a] -> Maybe (ContVec n a)Source
Convert list to continuation-based vector. Will fail with
Nothing
if list doesn't have right length.
replicate :: forall n a. Arity n => a -> ContVec n aSource
Execute monadic action for every element of vector. Synonym for pure
.
replicateM :: forall m n a. (Arity n, Monad m) => m a -> m (ContVec n a)Source
Execute monadic action for every element of vector.
generate :: forall n a. Arity n => (Int -> a) -> ContVec n aSource
Generate vector from function which maps element's index to its value.
generateM :: forall m n a. (Monad m, Arity n) => (Int -> m a) -> m (ContVec n a)Source
Generate vector from monadic function which maps element's index to its value.
Constructors
consV :: forall n a. ContVec (S Z) a -> ContVec n a -> ContVec (S n) aSource
Prepend single element to vector.
Transformations
imap :: Arity n => (Int -> a -> b) -> ContVec n a -> ContVec n bSource
Apply function to every element of the vector and its index.
mapM :: (Arity n, Monad m) => (a -> m b) -> ContVec n a -> m (ContVec n b)Source
Monadic map over vector.
imapM :: (Arity n, Monad m) => (Int -> a -> m b) -> ContVec n a -> m (ContVec n b)Source
Apply monadic function to every element of the vector and its index.
mapM_ :: (Arity n, Monad m) => (a -> m b) -> ContVec n a -> m ()Source
Apply monadic action to each element of vector and ignore result.
imapM_ :: (Arity n, Monad m) => (Int -> a -> m b) -> ContVec n a -> m ()Source
Apply monadic action to each element of vector and its index and ignore result.
sequence :: (Arity n, Monad m) => ContVec n (m a) -> m (ContVec n a)Source
Evaluate every action in the vector from left to right.
sequence_ :: (Arity n, Monad m) => ContVec n (m a) -> m ()Source
Evaluate every action in the vector from left to right and ignore result.
Zips
zipWith :: Arity n => (a -> b -> c) -> ContVec n a -> ContVec n b -> ContVec n cSource
Zip two vector together using function.
izipWith :: Arity n => (Int -> a -> b -> c) -> ContVec n a -> ContVec n b -> ContVec n cSource
Zip two vector together using function which takes element index as well.
zipWithM :: (Arity n, Monad m) => (a -> b -> m c) -> ContVec n a -> ContVec n b -> m (ContVec n c)Source
Zip two vector together using monadic function.
izipWithM :: (Arity n, Monad m) => (Int -> a -> b -> m c) -> ContVec n a -> ContVec n b -> m (ContVec n c)Source
Zip two vector together using monadic function which takes element index as well..
Running ContVec
runContVec :: Arity n => Fun n a r -> ContVec n a -> rSource
Run continuation vector. It's same as inspect
but with
arguments flipped.
Getters
head :: forall n a. Arity (S n) => ContVec (S n) a -> aSource
Finalizer function for getting head of the vector.
element :: (Arity n, Functor f) => Int -> (a -> f a) -> ContVec n a -> f (ContVec n a)Source
Twan van Laarhoven lens for continuation based vector
elementTy :: (Arity n, Index k n, Functor f) => k -> (a -> f a) -> ContVec n a -> f (ContVec n a)Source
Twan van Laarhoven's lens for element of vector with statically known index.
Vector construction
Folds
ifoldl :: forall n a b. Arity n => (b -> Int -> a -> b) -> b -> ContVec n a -> bSource
Left fold over continuation vector.
ifoldr :: forall n a b. Arity n => (Int -> a -> b -> b) -> b -> ContVec n a -> bSource
Right fold over continuation vector
foldM :: (Arity n, Monad m) => (b -> a -> m b) -> b -> ContVec n a -> m bSource
Monadic left fold over continuation vector.
ifoldM :: (Arity n, Monad m) => (b -> Int -> a -> m b) -> b -> ContVec n a -> m bSource
Monadic left fold over continuation vector.