HORIZON HASKELLDocslts/ghc-10.0.x8fef28d2026-11-02Search packagesCtrl K
Theme: |

GHC 10.0.0.20260917 · lts/ghc-10.0.x · 8fef28d · 2026-11-02

Modulevector-sized-1.6.1Haskell2010

Data.Vector.Storable.Sized

This module re-exports the functionality in Data.Vector.Generic.Sized specialized to Data.Vector.Storable.

Functions returning a vector determine the size from the type context unless they have a ' suffix in which case they take an explicit Proxy argument.

Functions where the resulting vector size is not known until runtime are not exported.

Contents
  1. Accessors
  2. Length information
  3. Indexing
  4. Monadic indexing
  5. Extracting subvectors (slicing)
  6. Construction
  7. Initialization
  8. Monadic initialization
  9. Unfolding
  10. Enumeration
  11. Concatenation
  12. Restricting memory usage
  13. Modifying vectors
  14. Bulk updates
  15. Accumulations
  16. Permutations
  17. Lenses
  18. Elementwise operations
  19. Indexing
  20. Mapping
  21. Monadic mapping
  22. Zipping
  23. Monadic zipping
  24. Unzipping
  25. Working with predicates
  26. Searching
  27. Folding
  28. Specialised folds
  29. Monadic folds
  30. Monadic sequencing
  31. Prefix sums (scans)
  32. Conversions
  33. Lists
  34. Mutable vectors
  35. Unsized Vectors
Synopsis
patternpattern SomeSized :: Storable a => KnownNat n => Vector n a -> Vector a

Pattern synonym that lets you treat an unsized vector as if it "contained" a sized vector. If you pattern match on an unsized vector, its contents will be the sized vector counterpart.

testFunc :: Unsized.Vector Int -> Int
testFunc (SomeSized v) =
    sum (zipWith (+) v (replicate 1))
        -- ^ here, v is `Sized.Vector n Int`, and we have
                    `KnownNat n`

The n type variable will be properly instantiated to whatever the length of the vector is, and you will also have a KnownNat n instance available. You can get n in scope by turning on ScopedTypeVariables and matching on SomeSized (v :: Sized.Vector n Int).

Without this, you would otherwise have to use withSized to do the same thing:

testFunc :: Unsized.Vector Int -> Int
testFunc u = withSized u $ \v ->
    sum (zipWith (+) v (replicate 1))

Remember that the type of final result of your function (the Int, here) must not depend on n. However, the types of the intermediate values are allowed to depend on n.

This is especially useful in do blocks, where you can pattern match on the unsized results of actions, to use the sized vector in the rest of the do block. You also get a KnownNat n constraint for the remainder of the do block.

-- If you had:
getAVector :: IO (Unsized.Vector Int)

main :: IO ()
main = do
    SomeSized v <- getAVector -- v is `Sized.Vector n Int`
    -- get n in scope
    SomeSized (v :: Sized.Vector n Int) <- getAVector
    print v

Remember that the final type of the result of the do block ((), here) must not depend on n. However, the

Also useful in ghci, where you can pattern match to get sized vectors from unsized vectors.

ghci> SomeSized v <- pure (myUnsizedVector :: Unsized.Vector Int)
             -- ^ v is `Sized.Vector n Int`

This enables interactive exploration with sized vectors in ghci, and is useful for using with other libraries and functions that expect sized vectors in an interactive setting.

(Note that as of GHC 8.6, you cannot get the n in scope in your ghci session using ScopedTypeVariables, like you can with do blocks)

You can also use this as a constructor, to take a sized vector and "hide" the size, to produce an unsized vector:

SomeSized :: Sized.Vector n a -> Unsized.Vector a

Accessors

Length information

valuelength' :: Vector n a -> Proxy n

O(1) Yield the length of the vector as a Proxy. This function doesn't do anything; it merely allows the size parameter of the vector to be passed around as a Proxy.

valueknownLength
  1. :: Storable a
  2. => Vector n a

    a vector of some (potentially unknown) length

  3. -> (KnownNat n => r)

    a value that depends on knowing the vector's length

  4. -> r

    the value computed with the length

O(1) Reveal a KnownNat instance for a vector's length, determined at runtime.

valueknownLength'
  1. :: Storable a
  2. => Vector n a

    a vector of some (potentially unknown) length

  3. -> (KnownNat n => Proxy n -> r)

    a value that depends on knowing the vector's length, which is given as a Proxy

  4. -> r

    the value computed with the length

O(1) Reveal a KnownNat instance and Proxy for a vector's length, determined at runtime.

Indexing

Monadic indexing

valueheadM :: (Storable a, Monad m) => Vector (1 + n) a -> m a

O(1) Yield the first element of a non-empty vector in a monad. See the documentation for indexM for an explanation of why this is useful.

valuelastM :: (Storable a, Monad m) => Vector (n + 1) a -> m a

O(1) Yield the last element of a non-empty vector in a monad. See the documentation for indexM for an explanation of why this is useful.

Extracting subvectors (slicing)

valuetake :: (KnownNat n, Storable a) => Vector (n + m) a -> Vector n a

O(1) Yield the first n elements. The resulting vector always contains this many elements. The length of the resulting vector is inferred from the type.

valuetake' :: (KnownNat n, Storable a) => p n -> Vector (n + m) a -> Vector n a

O(1) Yield the first n elements. The resulting vector always contains this many elements. The length of the resulting vector is given explicitly as a Proxy argument.

valuedrop :: (KnownNat n, Storable a) => Vector (n + m) a -> Vector m a

O(1) Yield all but the the first n elements. The given vector must contain at least this many elements. The length of the resulting vector is inferred from the type.

valuedrop' :: (KnownNat n, Storable a) => p n -> Vector (n + m) a -> Vector m a

O(1) Yield all but the the first n elements. The given vector must contain at least this many elements. The length of the resulting vector is givel explicitly as a Proxy argument.

Construction

Initialization

patternpattern Build :: Storable a => BuildVector n a -> Vector n a

O(n) Construct a vector in a type-safe manner using a sized linked list. Build (1 :< 2 :< 3 :< Nil) :: Vector 3 Int Build ("not" :< "much" :< Nil) :: Vector 2 String Can also be used as a pattern.

valueiterateN :: (KnownNat n, Storable a) => (a -> a) -> a -> Vector n a

O(n) Apply function n times to value. Zeroth element is original value. The length is inferred from the type.

valueiterateN' :: (KnownNat n, Storable a) => p n -> (a -> a) -> a -> Vector n a

O(n) Apply function n times to value. Zeroth element is original value. The length is given explicitly as a Proxy argument.

Monadic initialization

Unfolding

valueunfoldrN :: (KnownNat n, Storable a) => (b -> (a, b)) -> b -> Vector n a

O(n) Construct a vector with exactly n elements by repeatedly applying the generator function to the a seed. The length is inferred from the type.

valueunfoldrN'
  1. :: (KnownNat n, Storable a)
  2. => p n
  3. -> b -> (a, b)
  4. -> b
  5. -> Vector n a

O(n) Construct a vector with exactly n elements by repeatedly applying the generator function to the a seed. The length is given explicitly as a Proxy argument.

Enumeration

Concatenation

Restricting memory usage

valueforce :: Storable a => Vector n a -> Vector n a

O(n) Yield the argument but force it not to retain any extra memory, possibly by copying it.

This is especially useful when dealing with slices. For example:

force (slice 0 2 <huge vector>)

Here, the slice retains a reference to the huge vector. Forcing it creates a copy of just the elements that belong to the slice and allows the huge vector to be garbage collected.

Modifying vectors

Bulk updates

value(//)
  1. :: Storable a
  2. => Vector m a

    initial vector (of length m)

  3. -> [(Finite m, a)]

    list of index/value pairs (of length n)

  4. -> Vector m a

O(m+n) For each pair (i,a) from the list, replace the vector element at position i by a.

<5,9,2,7> // [(2,1),(0,3),(2,8)] = <3,9,8,7>
valueupdate
  1. :: (Storable a, Storable (Int, a))
  2. => Vector m a

    initial vector (of length m)

  3. -> Vector n (Int, a)

    vector of index/value pairs (of length n)

  4. -> Vector m a

O(m+n) For each pair (i,a) from the vector of index/value pairs, replace the vector element at position i by a.

update <5,9,2,7> <(2,1),(0,3),(2,8)> = <3,9,8,7>
valueupdate_
  1. :: Storable a
  2. => Vector m a

    initial vector (of length m)

  3. -> Vector n Int

    index vector (of length n)

  4. -> Vector n a

    value vector (of length n)

  5. -> Vector m a

O(m+n) For each index i from the index vector and the corresponding value a from the value vector, replace the element of the initial vector at position i by a.

update_ <5,9,2,7>  <2,0,2> <1,3,8> = <3,9,8,7>

This function is useful for instances of Vector that cannot store pairs. Otherwise, update is probably more convenient.

update_ xs is ys = update xs (zip is ys)

Accumulations

valueaccum
  1. :: Storable a
  2. => (a -> b -> a)

    accumulating function f

  3. -> Vector m a

    initial vector (of length m)

  4. -> [(Finite m, b)]

    list of index/value pairs (of length n)

  5. -> Vector m a

O(m+n) For each pair (i,b) from the list, replace the vector element a at position i by f a b.

accum (+) <5,9,2> [(2,4),(1,6),(0,3),(1,7)] = <5+3, 9+6+7, 2+4>
valueaccumulate
  1. :: (Storable a, Storable (Int, b))
  2. => (a -> b -> a)

    accumulating function f

  3. -> Vector m a

    initial vector (of length m)

  4. -> Vector n (Int, b)

    vector of index/value pairs (of length n)

  5. -> Vector m a

O(m+n) For each pair (i,b) from the vector of pairs, replace the vector element a at position i by f a b.

accumulate (+) <5,9,2> <(2,4),(1,6),(0,3),(1,7)> = <5+3, 9+6+7, 2+4>
valueaccumulate_
  1. :: (Storable a, Storable b)
  2. => (a -> b -> a)

    accumulating function f

  3. -> Vector m a

    initial vector (of length m)

  4. -> Vector n Int

    index vector (of length n)

  5. -> Vector n b

    value vector (of length n)

  6. -> Vector m a

O(m+n) For each index i from the index vector and the corresponding value b from the the value vector, replace the element of the initial vector at position i by f a b.

accumulate_ (+) <5,9,2> <2,1,0,1> <4,6,3,7> = <5+3, 9+6+7, 2+4>

This function is useful for instances of Vector that cannot store pairs. Otherwise, accumulate is probably more convenient:

accumulate_ f as is bs = accumulate f as (zip is bs)

Permutations

valuebackpermute
  1. :: Storable a
  2. => Vector m a

    xs value vector

  3. -> Vector n Int

    is index vector (of length n)

  4. -> Vector n a

O(n) Yield the vector obtained by replacing each element i of the index vector by xs!i. This is equivalent to map (xs!) is but is often much more efficient.

backpermute <a,b,c,d> <0,3,2,3,1,0> = <a,d,c,d,b,a>

Lenses

Elementwise operations

Indexing

Mapping

Monadic mapping

valuemapM_ :: (Monad m, Storable a) => (a -> m b) -> Vector n a -> m ()

O(n) Apply the monadic action to all elements of a vector and ignore the results.

valueforM_ :: (Monad m, Storable a) => Vector n a -> (a -> m b) -> m ()

O(n) Apply the monadic action to all elements of a vector and ignore the results. Equivalent to flip mapM_.

Zipping

Monadic zipping

Unzipping

Working with predicates

Searching

Folding

valueifoldl' :: Storable b => (a -> Finite n -> b -> a) -> a -> Vector n b -> a

O(n) Left fold with strict accumulator (function applied to each element and its index).

valueifoldr' :: Storable a => (Finite n -> a -> b -> b) -> b -> Vector n a -> b

O(n) Right fold with strict accumulator (function applied to each element and its index).

Specialised folds

Monadic folds

valueifoldM'_
  1. :: (Monad m, Storable b)
  2. => a -> Finite n -> b -> m a
  3. -> a
  4. -> Vector n b
  5. -> m ()

O(n) Monadic fold with strict accumulator that discards the result (action applied to each element and its index).

valuefold1M'_
  1. :: (Monad m, Storable a)
  2. => a -> a -> m a
  3. -> Vector (n + 1) a
  4. -> m ()

O(n) Monad fold over non-empty vectors with strict accumulator that discards the result.

Monadic sequencing

Prefix sums (scans)

Conversions

Lists

valuewithSizedList
  1. :: Storable a
  2. => [a]
  3. -> forall (n :: Nat). KnownNat n => Vector n a -> r
  4. -> r

O(n) Takes a list and returns a continuation providing a vector with a size parameter corresponding to the length of the list.

Essentially converts a list into a vector with the proper size parameter, determined at runtime.

See withSized

Mutable vectors

Unsized Vectors