| Copyright | (c) ForSyDe Group KTH 2007-2019 | 
|---|---|
| License | BSD-style (see the file LICENSE) | 
| Maintainer | forsyde-dev@kth.se | 
| Stability | experimental | 
| Portability | portable | 
| Safe Haskell | Safe-Inferred | 
| Language | Haskell2010 | 
ForSyDe.Shallow.Core.Vector
Description
This module defines the data type Vector and the corresponding
 functions. It is a development of the module defined by
 Reekie.
 The Vector data type is a shallow interpretation of arrays and is
 used for quick prototyping of array algorithms and skeletons,
 whereas in fact it is implemented as an infinite list itself. For a
 type-checked fixed-size data type for representing vectors, see
 FSVec or
 REPA.
OBS: The lengths in the API documentation for function arguments are not type-safe, but rather suggestions for usage in designing vector algorithms or skeletons.
Synopsis
- data Vector a
 - (<+>) :: Vector a -> Vector a -> Vector a
 - (<:) :: Vector a -> a -> Vector a
 - nullV :: Vector a -> Bool
 - lengthV :: Vector a -> Int
 - vector :: [a] -> Vector a
 - fromVector :: Vector a -> [a]
 - unitV :: a -> Vector a
 - iterateV :: (Num a, Eq a) => a -> (b -> b) -> b -> Vector b
 - generateV :: (Num a, Eq a) => a -> (b -> b) -> b -> Vector b
 - copyV :: (Num a, Eq a) => a -> b -> Vector b
 - mapV :: (a -> b) -> Vector a -> Vector b
 - zipWithV :: (a -> b -> c) -> Vector a -> Vector b -> Vector c
 - zipWith3V :: (a -> b -> c -> d) -> Vector a -> Vector b -> Vector c -> Vector d
 - reduceV :: (a -> a -> a) -> Vector a -> a
 - pipeV :: Vector (a -> a) -> a -> a
 - foldlV :: (a -> b -> a) -> a -> Vector b -> a
 - foldrV :: (b -> a -> a) -> a -> Vector b -> a
 - scanlV :: (a -> b -> a) -> a -> Vector b -> Vector a
 - scanrV :: (b -> a -> a) -> a -> Vector b -> Vector a
 - atV :: Integral a => Vector b -> a -> b
 - headV :: Vector a -> a
 - tailV :: Vector a -> Vector a
 - lastV :: Vector a -> a
 - initV :: Vector a -> Vector a
 - headsV :: Vector a -> Vector (Vector a)
 - tailsV :: Vector a -> Vector (Vector a)
 - takeV :: (Num a, Ord a) => a -> Vector b -> Vector b
 - dropV :: (Num a, Ord a) => a -> Vector b -> Vector b
 - selectV :: Int -> Int -> Int -> Vector a -> Vector a
 - groupV :: Int -> Vector a -> Vector (Vector a)
 - filterV :: (a -> Bool) -> Vector a -> Vector a
 - stencilV :: Int -> Vector a -> Vector (Vector a)
 - replaceV :: Vector a -> Int -> a -> Vector a
 - zipV :: Vector a -> Vector b -> Vector (a, b)
 - unzipV :: Vector (a, b) -> (Vector a, Vector b)
 - concatV :: Vector (Vector a) -> Vector a
 - reverseV :: Vector a -> Vector a
 - shiftlV :: Vector a -> a -> Vector a
 - shiftrV :: Vector a -> a -> Vector a
 - rotrV :: Vector a -> Vector a
 - rotlV :: Vector a -> Vector a
 - rotateV :: Int -> Vector a -> Vector a
 
Documentation
The data type Vector is modeled similar to a list. It has two data type constructors. NullV constructs the empty vector, while :> constructsa vector by adding an value to an existing vector..
Vector is an instance of the classes Read and Show. This means that the vector
1:>2:>3:>NullV
is shown as
<1,2,3>
The operator <+> concatenates two vectors.
The operator (<:) appends an element at the end of a vector.
Queries
Generators
fromVector :: Vector a -> [a] Source #
The function fromVector converts a vector into a list.
Arguments
| :: (Num a, Eq a) | |
| => a | number of elements =   | 
| -> (b -> b) | generator function (  | 
| -> b | initial element  | 
| -> Vector b | generated vector; length =   | 
The function iterateV generates a vector with a given number of
 elements starting from an initial element using a supplied function
 for the generation of elements.
>>>iterateV 5 (+1) 1<1,2,3,4,5>
The function copyV generates a vector with a given number of
 copies of the same element.
>>>copyV 7 5<5,5,5,5,5,5,5>
Functional skeletons
The higher-order function mapV applies a function on all elements of a vector.
Arguments
| :: (a -> b -> c) | |
| -> Vector a | length =   | 
| -> Vector b | length =   | 
| -> Vector c | length =   | 
The higher-order function zipWithV applies a function pairwise on two vectors.
Arguments
| :: (a -> b -> c -> d) | |
| -> Vector a | length =   | 
| -> Vector b | length =   | 
| -> Vector c | length =   | 
| -> Vector d | length =   | 
The higher-order function zipWithV3 applies a function 3-tuple-wise on three vectors.
reduceV :: (a -> a -> a) -> Vector a -> a Source #
Reduces a vector of elements to a single element based on a binary function.
>>>reduceV (+) $ vector [1,2,3,4,5]15
pipeV :: Vector (a -> a) -> a -> a Source #
Pipes an element through a vector of functions.
>>>vector [(*2), (+1), (/3)] `pipeV` 3 -- is the same as ((*2) . (+1) . (/3)) 34.0
foldlV :: (a -> b -> a) -> a -> Vector b -> a Source #
The higher-order functions foldlV folds a function from the
 right to the left over a vector using an initial value.
>>>foldlV (-) 8 $ vector [4,2,1] -- is the same as (((8 - 4) - 2) - 1)1
foldrV :: (b -> a -> a) -> a -> Vector b -> a Source #
The higher-order functions foldrV folds a function from the
 left to the right over a vector using an initial value.
>>>foldrV (-) 8 $ vector [4,2,1] -- is the same as (4 - (2 - (1 - 8)))-5
Arguments
| :: (a -> b -> a) | funtion to generate next element  | 
| -> a | initial element  | 
| -> Vector b | input vector; length =   | 
| -> Vector a | output vector; length =   | 
Performs the parallel prefix operation on a vector.
>>>scanlV (+) 0 $ vector [1,1,1,1,1,1]<1,2,3,4,5,6>
Arguments
| :: (b -> a -> a) | funtion to generate next element  | 
| -> a | initial element  | 
| -> Vector b | input vector; length =   | 
| -> Vector a | output vector; length =   | 
Performs the parallel suffix operation on a vector.
>>>scanrV (+) 0 $ vector [1,1,1,1,1,1]<6,5,4,3,2,1>
Selectors
atV :: Integral a => Vector b -> a -> b Source #
The function atV returns the n-th element in a vector, starting
 from zero.
>>>vector [1,2,3,4,5] `atV` 34
The functions tailV returns all, but the first element of a vector.
The function initV returns all but the last elements of a vector.
Returns a vector containing all the possible prefixes of an input vector.
>>>let v = vector [1,2,3,4,5,6]>>>headsV v<<1>,<1,2>,<1,2,3>,<1,2,3,4>,<1,2,3,4,5>,<1,2,3,4,5,6>,<1,2,3,4,5,6>>
Returns a vector containing all the possible suffixes of an input vector.
>>>let v = vector [1,2,3,4,5,6]>>>tailsV v<<1,2,3,4,5,6>,<2,3,4,5,6>,<3,4,5,6>,<4,5,6>,<5,6>,<6>,<>>
The function takeV returns the first n elements of a vector.
>>>takeV 2 $ vector [1,2,3,4,5]<1,2>
The function dropV drops the first n elements of a vector.
>>>dropV 2 $ vector [1,2,3,4,5]<3,4,5>
Arguments
| :: Int | the initial element, starting from zero  | 
| -> Int | stepsize between elements  | 
| -> Int | number of elements   | 
| -> Vector a | length =   | 
| -> Vector a | length   | 
The function selectV selects elements in the vector based on a
 regular stride.
The function groupV groups a vector into a vector of vectors of
 size n.
>>>groupV 3 $ vector [1,2,3,4,5,6,7,8]<<1,2,3>,<4,5,6>>
The higher-function filterV takes a predicate function and a
 vector and creates a new vector with the elements for which the
 predicate is true.
>>>filterV odd $ vector [1,2,3,4,5,6,7,8]<1,3,5,7>
(*) however, the length is unknown, because it is dependent on
 the data contained inside the vector. Try avoiding filterV in
 designs where the size of the data is crucial.
Returns a stencil of n neighboring elements for each possible
 element in a vector.
>>>stencilV 3 $ vector [1..5]<<1,2,3>,<2,3,4>,<3,4,5>>
Permutators
Arguments
| :: Vector a | input vector; length =   | 
| -> Int | position of the element to be replaced  | 
| -> a | new element  | 
| -> Vector a | altered vector; length =   | 
The function replaceV replaces an element in a vector.
>>>replaceV (vector [1..5]) 2 100<1,2,100,4,5>
The function zipV zips two vectors into a vector of tuples.
The function unzipV unzips a vector of tuples into two vectors.
concatV :: Vector (Vector a) -> Vector a Source #
The function concatV transforms a vector of vectors to a single vector. 
reverseV :: Vector a -> Vector a Source #
The function reverseV reverses the order of elements in a vector. 
shiftlV :: Vector a -> a -> Vector a Source #
The function shiftlV shifts a value from the left into a vector.
>>>vector [1..5] `shiftlV` 100<100,1,2,3,4>
shiftrV :: Vector a -> a -> Vector a Source #
The function shiftrV shifts a value from the right into a vector. 
>>>vector [1..5] `shiftrV` 100<2,3,4,5,100>
rotrV :: Vector a -> Vector a Source #
The function rotrV rotates a vector to the right. Note that
 this fuction does not change the size of a vector.
>>>rotrV $ vector [1..5]<2,3,4,5,1>