Safe Haskell | None |
---|---|
Language | Haskell98 |
API for Church-encoded vectors. Implementation of function from Data.Vector.Fixed module uses these function internally in order to provide shortcut fusion.
- data PeanoNum
- type family Peano (n :: Nat) :: PeanoNum where ...
- type family Add (n :: PeanoNum) (m :: PeanoNum) :: PeanoNum where ...
- type family Fn (n :: PeanoNum) (a :: *) (b :: *) where ...
- newtype Fun n a b = Fun {}
- type Arity n = (ArityPeano (Peano n), KnownNat n, Peano (n + 1) ~ S (Peano n))
- class ArityPeano n where
- arity :: KnownNat n => proxy n -> Int
- apply :: Arity n => (forall k. t (S k) -> (a, t k)) -> t (Peano n) -> ContVec n a
- applyM :: (Applicative f, Arity n) => (forall k. t (S k) -> (f a, t k)) -> t (Peano n) -> f (ContVec n a)
- constFun :: Fun n a b -> Fun (S n) a b
- curryFirst :: Fun (S n) a b -> a -> Fun n a b
- uncurryFirst :: (a -> Fun n a b) -> Fun (S n) a b
- curryLast :: ArityPeano n => Fun (S n) a b -> Fun n a (a -> b)
- curryMany :: forall n k a b. ArityPeano n => Fun (Add n k) a b -> Fun n a (Fun k a b)
- apLast :: ArityPeano n => Fun (S n) a b -> a -> Fun n a b
- shuffleFun :: ArityPeano n => (b -> Fun n a r) -> Fun n a (b -> r)
- withFun :: (Fun n a b -> Fun n a b) -> Fun (S n) a b -> Fun (S n) a b
- type family Dim (v :: * -> *) :: Nat
- 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. KnownNat (Dim v) => v a -> Int
- newtype ContVec n a = ContVec (forall r. Fun (Peano n) a r -> r)
- newtype CVecPeano n a = CVecPeano (forall r. Fun n a r -> r)
- consPeano :: a -> CVecPeano n a -> CVecPeano (S n) a
- toContVec :: CVecPeano (Peano n) a -> ContVec n a
- runContVec :: Fun (Peano n) a r -> ContVec n a -> r
- cvec :: (Vector v a, Dim v ~ n) => v a -> ContVec n a
- fromList :: 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 :: Arity n => a -> ContVec n a
- replicateM :: (Arity n, Applicative f) => f a -> f (ContVec n a)
- generate :: Arity n => (Int -> a) -> ContVec n a
- generateM :: (Applicative f, Arity n) => (Int -> f a) -> f (ContVec n a)
- unfoldr :: Arity n => (b -> (a, b)) -> b -> ContVec n a
- basis :: (Num a, Arity n) => Int -> ContVec n a
- empty :: ContVec 0 a
- cons :: Arity n => a -> ContVec n a -> ContVec (n + 1) a
- consV :: Arity n => ContVec 1 a -> ContVec n a -> ContVec (n + 1) a
- snoc :: Arity n => a -> ContVec n a -> ContVec (n + 1) a
- concat :: (Arity n, Arity k, Arity (n + k), Peano (n + k) ~ Add (Peano n) (Peano k)) => ContVec n a -> ContVec k a -> ContVec (n + k) a
- mk1 :: a -> ContVec 1 a
- mk2 :: a -> a -> ContVec 2 a
- mk3 :: a -> a -> a -> ContVec 3 a
- mk4 :: a -> a -> a -> a -> ContVec 4 a
- mk5 :: a -> a -> a -> a -> a -> ContVec 5 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, Applicative f) => (a -> f b) -> ContVec n a -> f (ContVec n b)
- imapM :: (Arity n, Applicative f) => (Int -> a -> f b) -> ContVec n a -> f (ContVec n b)
- mapM_ :: (Arity n, Applicative f) => (a -> f b) -> ContVec n a -> f ()
- imapM_ :: (Arity n, Applicative f) => (Int -> a -> f b) -> ContVec n a -> f ()
- scanl :: Arity n => (b -> a -> b) -> b -> ContVec n a -> ContVec (n + 1) b
- scanl1 :: Arity n => (a -> a -> a) -> ContVec n a -> ContVec n a
- sequence :: (Arity n, Applicative f) => ContVec n (f a) -> f (ContVec n a)
- sequence_ :: (Arity n, Applicative f) => ContVec n (f a) -> f ()
- distribute :: (Functor f, Arity n) => f (ContVec n a) -> ContVec n (f a)
- collect :: (Functor f, Arity n) => (a -> ContVec n b) -> f a -> ContVec n (f b)
- tail :: Arity n => ContVec (n + 1) 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
- zipWith3 :: Arity n => (a -> b -> c -> d) -> ContVec n a -> ContVec n b -> ContVec n c -> ContVec n d
- izipWith :: Arity n => (Int -> a -> b -> c) -> ContVec n a -> ContVec n b -> ContVec n c
- izipWith3 :: Arity n => (Int -> a -> b -> c -> d) -> ContVec n a -> ContVec n b -> ContVec n c -> ContVec n d
- zipWithM :: (Arity n, Applicative f) => (a -> b -> f c) -> ContVec n a -> ContVec n b -> f (ContVec n c)
- zipWithM_ :: (Arity n, Applicative f) => (a -> b -> f c) -> ContVec n a -> ContVec n b -> f ()
- izipWithM :: (Arity n, Applicative f) => (Int -> a -> b -> f c) -> ContVec n a -> ContVec n b -> f (ContVec n c)
- izipWithM_ :: (Arity n, Applicative f) => (Int -> a -> b -> f c) -> ContVec n a -> ContVec n b -> f ()
- head :: (Arity n, 1 <= n) => ContVec n a -> a
- index :: Arity n => Int -> ContVec n a -> a
- element :: (Arity n, Functor f) => Int -> (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 :: (Arity n, 1 <= n) => (a -> a -> a) -> ContVec n a -> a
- foldr :: Arity n => (a -> b -> b) -> b -> ContVec n a -> b
- ifoldl :: Arity n => (b -> Int -> a -> b) -> b -> ContVec n a -> b
- ifoldr :: 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 n, 1 <= n) => ContVec n a -> a
- maximum :: (Ord a, Arity n, 1 <= n) => ContVec 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
- find :: Arity n => (a -> Bool) -> ContVec n a -> Maybe a
- gfoldl :: forall c v a. (Vector v a, Data a) => (forall x y. Data x => c (x -> y) -> x -> c y) -> (forall x. x -> c x) -> v a -> c (v a)
- gunfold :: forall con c v a. (Vector v a, Data a) => (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> con -> c (v a)
Type-level numbers
Peano numbers. Since type level naturals don't support induction we have to convert type nats to Peano representation first and work with it,
type family Peano (n :: Nat) :: PeanoNum where ... Source #
Convert type level natural to Peano representation
type family Add (n :: PeanoNum) (m :: PeanoNum) :: PeanoNum where ... Source #
Type family for sum of unary natural numbers.
N-ary functions
type family Fn (n :: PeanoNum) (a :: *) (b :: *) where ... Source #
Type family for n-ary functions. n
is number of parameters of
type a
and b
is result type.
Newtype wrapper which is used to make Fn
injective. It's also a
reader monad.
ArityPeano n => Monad (Fun n a) Source # | |
ArityPeano n => Functor (Fun n a) Source # | |
ArityPeano n => Applicative (Fun n a) Source # | |
type Arity n = (ArityPeano (Peano n), KnownNat n, Peano (n + 1) ~ S (Peano n)) Source #
Type class for type level number for which we can defined operations over N-ary functions.
class ArityPeano n where Source #
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 |
-> Fun 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 |
-> (CVecPeano n a, t Z) |
Apply all parameters to the function.
:: Applicative f | |
=> (forall k. t (S k) -> (f a, t k)) | Get value to apply to function |
-> t n | Initial value |
-> (f (CVecPeano 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 ~ ContVec n a
reverseF :: Fun n a b -> Fun n a b Source #
Reverse order of parameters. It's implemented directly in type
class since expressing it in terms of accum
will require
putting ArityPeano constraint on step funcion
gunfoldF :: Data a => (forall b x. Data b => c (b -> x) -> c x) -> T_gunfold c r a n -> c r Source #
Worker function for gunfold
ArityPeano Z Source # | |
ArityPeano n => ArityPeano (S n) Source # | |
:: Arity n | |
=> (forall k. t (S k) -> (a, t k)) | Get value to apply to function |
-> t (Peano n) | Initial value |
-> ContVec n a | N-ary function |
Apply all parameters to the function.
:: (Applicative f, Arity n) | |
=> (forall k. t (S k) -> (f a, t k)) | Get value to apply to function |
-> t (Peano n) | Initial value |
-> f (ContVec n a) |
Apply all parameters to the function using applicative actions.
Combinators
curryLast :: ArityPeano n => Fun (S n) a b -> Fun n a (a -> b) Source #
Curry last parameter of n-ary function
curryMany :: forall n k a b. ArityPeano n => Fun (Add n k) a b -> Fun n a (Fun k a b) Source #
Curry n first parameters of n-ary function
apLast :: ArityPeano n => Fun (S n) a b -> a -> Fun n a b Source #
Apply last parameter to function. Unlike apFun
we need to
traverse all parameters but last hence Arity
constraint.
shuffleFun :: ArityPeano n => (b -> Fun n a r) -> Fun n a (b -> r) Source #
Move function parameter to the result of N-ary function.
withFun :: (Fun n a b -> Fun n a b) -> Fun (S n) a b -> Fun (S n) a b Source #
Recursive step for the function
Vector type class
type family Dim (v :: * -> *) :: Nat Source #
Size of vector expressed as type-level natural.
type Dim Complex Source # | |
type Dim Identity Source # | |
type Dim Only Source # | |
type Dim ((,) a) Source # | |
type Dim (Proxy *) Source # | |
type Dim (ContVec n) Source # | |
type Dim (Empty *) Source # | |
type Dim (VecList n) Source # | |
type Dim (Vec n) Source # | |
type Dim (Vec n) Source # | |
type Dim (Vec n) Source # | |
type Dim (Vec n) Source # | |
type Dim ((,,) a b) Source # | |
type Dim ((,,,) a b c) Source # | |
type Dim ((,,,,) a b c d) Source # | |
type Dim ((,,,,,) a b c d e) Source # | |
type Dim ((,,,,,,) a b c d e f) Source # | |
class Arity (Dim v) => Vector v a where Source #
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
For example instance for 2D vectors could be written as:
data V2 a = V2 a a type instance V2 = 2 instance Vector V2 a where construct = Fun V2 inspect (V2 a b) (Fun f) = f a b
construct :: Fun (Peano (Dim v)) a (v a) Source #
N-ary function for creation of vectors.
inspect :: v a -> Fun (Peano (Dim v)) a b -> b Source #
Deconstruction of vector.
basicIndex :: v a -> Int -> a Source #
Optional more efficient implementation of indexing. Shouldn't
be used directly, use !
instead.
Vector Complex a Source # | |
Vector Identity a Source # | |
Vector Only a Source # | |
(~) * b a => Vector ((,) b) a Source # | Note this instance (and other instances for tuples) is
essentially monomorphic in element type. Vector type v of 2
element tuple |
Vector (Proxy *) a Source # | |
Arity n => Vector (ContVec n) a Source # | |
Vector (Empty *) a Source # | |
Arity n => Vector (VecList n) a Source # | |
Arity n => Vector (Vec n) a Source # | |
(Arity n, Prim a) => Vector (Vec n) a Source # | |
(Arity n, Storable a) => Vector (Vec n) a Source # | |
Unbox n a => Vector (Vec n) a Source # | |
((~) * b a, (~) * c a) => Vector ((,,) b c) a Source # | |
((~) * b a, (~) * c a, (~) * d a) => Vector ((,,,) b c d) a Source # | |
((~) * b a, (~) * c a, (~) * d a, (~) * e a) => Vector ((,,,,) b c d e) a Source # | |
((~) * b a, (~) * c a, (~) * d a, (~) * e a, (~) * f a) => Vector ((,,,,,) b c d e f) a Source # | |
((~) * b a, (~) * c a, (~) * d a, (~) * e a, (~) * f a, (~) * g a) => Vector ((,,,,,,) b c d e f g) a Source # | |
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. KnownNat (Dim v) => v a -> Int Source #
Length of vector. Function doesn't evaluate its argument.
Vector as continuation
Vector represented as continuation. Alternative wording: it's Church encoded N-element vector.
runContVec :: Fun (Peano n) a r -> ContVec n a -> r Source #
Run continuation vector. It's same as inspect
but with
arguments flipped.
Construction of ContVec
cvec :: (Vector v a, Dim v ~ n) => v a -> ContVec n a Source #
Convert regular vector to continuation based one.
fromList :: Arity n => [a] -> ContVec n a Source #
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 a Source #
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 :: Arity n => a -> ContVec n a Source #
Execute monadic action for every element of vector. Synonym for pure
.
replicateM :: (Arity n, Applicative f) => f a -> f (ContVec n a) Source #
Execute monadic action for every element of vector.
generate :: Arity n => (Int -> a) -> ContVec n a Source #
Generate vector from function which maps element's index to its value.
generateM :: (Applicative f, Arity n) => (Int -> f a) -> f (ContVec n a) Source #
Generate vector from monadic function which maps element's index to its value.
Constructors
consV :: Arity n => ContVec 1 a -> ContVec n a -> ContVec (n + 1) a Source #
Prepend single element vector to another vector.
concat :: (Arity n, Arity k, Arity (n + k), Peano (n + k) ~ Add (Peano n) (Peano k)) => ContVec n a -> ContVec k a -> ContVec (n + k) a Source #
Concatenate vector
Transformations
imap :: Arity n => (Int -> a -> b) -> ContVec n a -> ContVec n b Source #
Apply function to every element of the vector and its index.
mapM :: (Arity n, Applicative f) => (a -> f b) -> ContVec n a -> f (ContVec n b) Source #
Effectful map over vector.
imapM :: (Arity n, Applicative f) => (Int -> a -> f b) -> ContVec n a -> f (ContVec n b) Source #
Apply monadic function to every element of the vector and its index.
mapM_ :: (Arity n, Applicative f) => (a -> f b) -> ContVec n a -> f () Source #
Apply monadic action to each element of vector and ignore result.
imapM_ :: (Arity n, Applicative f) => (Int -> a -> f b) -> ContVec n a -> f () Source #
Apply monadic action to each element of vector and its index and ignore result.
scanl :: Arity n => (b -> a -> b) -> b -> ContVec n a -> ContVec (n + 1) b Source #
Left scan over vector
sequence :: (Arity n, Applicative f) => ContVec n (f a) -> f (ContVec n a) Source #
Evaluate every action in the vector from left to right.
sequence_ :: (Arity n, Applicative f) => ContVec n (f a) -> f () Source #
Evaluate every action in the vector from left to right and ignore result.
distribute :: (Functor f, Arity n) => f (ContVec n a) -> ContVec n (f a) Source #
The dual of sequenceA
Zips
zipWith :: Arity n => (a -> b -> c) -> ContVec n a -> ContVec n b -> ContVec n c Source #
Zip two vector together using function.
zipWith3 :: Arity n => (a -> b -> c -> d) -> ContVec n a -> ContVec n b -> ContVec n c -> ContVec n d Source #
Zip three vectors together
izipWith :: Arity n => (Int -> a -> b -> c) -> ContVec n a -> ContVec n b -> ContVec n c Source #
Zip two vector together using function which takes element index as well.
izipWith3 :: Arity n => (Int -> a -> b -> c -> d) -> ContVec n a -> ContVec n b -> ContVec n c -> ContVec n d Source #
Zip three vectors together
zipWithM :: (Arity n, Applicative f) => (a -> b -> f c) -> ContVec n a -> ContVec n b -> f (ContVec n c) Source #
Zip two vector together using monadic function.
zipWithM_ :: (Arity n, Applicative f) => (a -> b -> f c) -> ContVec n a -> ContVec n b -> f () Source #
izipWithM :: (Arity n, Applicative f) => (Int -> a -> b -> f c) -> ContVec n a -> ContVec n b -> f (ContVec n c) Source #
Zip two vector together using monadic function which takes element index as well..
izipWithM_ :: (Arity n, Applicative f) => (Int -> a -> b -> f c) -> ContVec n a -> ContVec n b -> f () Source #
Getters
head :: (Arity n, 1 <= n) => ContVec n a -> a Source #
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
Vector construction
Folds
foldl :: Arity n => (b -> a -> b) -> b -> ContVec n a -> b Source #
Left fold over continuation vector.
foldr :: Arity n => (a -> b -> b) -> b -> ContVec n a -> b Source #
Right fold over continuation vector
ifoldl :: Arity n => (b -> Int -> a -> b) -> b -> ContVec n a -> b Source #
Left fold over continuation vector.
ifoldr :: Arity n => (Int -> a -> b -> b) -> b -> ContVec n a -> b Source #
Right fold over continuation vector
foldM :: (Arity n, Monad m) => (b -> a -> m b) -> b -> ContVec n a -> m b Source #
Monadic left fold over continuation vector.
ifoldM :: (Arity n, Monad m) => (b -> Int -> a -> m b) -> b -> ContVec n a -> m b Source #
Monadic left fold over continuation vector.
Special folds
all :: Arity n => (a -> Bool) -> ContVec n a -> Bool Source #
Determines whether all elements of vector satisfy predicate.
any :: Arity n => (a -> Bool) -> ContVec n a -> Bool Source #
Determines whether any of element of vector satisfy predicate.