vector
Efficient Arrays
https://github.com/haskell/vector
| LTS Haskell 24.16: | 0.13.2.0@rev:2 |
| Stackage Nightly 2025-10-24: | 0.13.2.0@rev:2 |
| Latest on Hackage: | 0.13.2.0@rev:2 |
vector-0.13.2.0@sha256:9ac338c8da52d8a37db08434ca4480fef2cea4f9aac240f4f994bb467f5275b4,8804Module documentation for 0.13.2.0
- Data
- Data.Vector
- Data.Vector.Fusion
- Data.Vector.Generic
- Data.Vector.Generic.Base
- Data.Vector.Generic.Mutable
- Data.Vector.Generic.New
- Data.Vector.Internal
- Data.Vector.Internal.Check
- Data.Vector.Mutable
- Data.Vector.Primitive
- Data.Vector.Storable
- Data.Vector.Storable.Internal
- Data.Vector.Storable.Mutable
- Data.Vector.Strict
- Data.Vector.Unboxed
- Data.Vector.Unboxed.Base
- Data.Vector.Unboxed.Mutable
- Data.Vector
The vector package 
Vector is a collection of efficient Int-indexed array implementations:
boxed, unboxed, storable, and primitive vectors
(all can be mutable or immutable). The package features a generic API,
polymorphic in vector type, and implements stream fusion,
a powerful optimisation framework that can help eliminate intermediate data structures.
Table of Contents
Tutorial
A beginner-friendly tutorial for vectors can be found on MMHaskell.
If you have already started your adventure with vectors, the tutorial on Haskell Wiki covers more ground.
Vector vs Array
Arrays are data structures that can store a multitude of elements and allow immediate access to every one of them. However, they are often seen as legacy constructs that are rarely used in modern Haskell. Even though Haskell has a built-in Data.Array module, arrays might be a bit overwhelming to use due to their complex API. Conversely, vectors incorporate the array’s O(1) access to elements with a much friendlier API of lists. Since they allow for framework optimisation via loop fusion, vectors emphasise efficiency and keep a rich interface. Unless you’re confident with arrays, it’s well-advised to use vectors when looking for a similar functionality.
Vectors Available in the Package
Lazy boxed vectors (Data.Vector) store each of their elements as a
pointer to a heap-allocated value. Because of indirection, lazy boxed vectors
are slower in comparison to unboxed vectors.
Strict boxed vectors (Data.Vector.Strict) contain elements that are
strictly evaluated.
Unboxed vectors (Data.Vector.Unboxed) determine an array’s representation
from its elements’ type. For example, vector of primitive types (e.g. Int) will be
backed by primitive array while vector of product types by structure of arrays.
They are quite efficient due to the unboxed representation they use.
Storable vectors (Data.Vector.Storable) are backed by pinned memory, i.e.,
they cannot be moved by the garbage collector. Their primary use case is C FFI.
Primitive vectors (Data.Vector.Primitive) are backed by simple byte array and
can store only data types that are represented in memory as a sequence of bytes without
a pointer, i.e., they belong to the Prim type class, e.g., Int, Double, etc.
It’s advised to use unboxed vectors if you’re looking for the performance of primitive vectors,
but more versality.
Stream Fusion
An optimisation framework used by vectors, stream fusion is a technique that merges
several functions into one and prevents creation of intermediate data structures. For example,
the expression sum . filter g . map f won’t allocate temporary vectors if
compiled with optimisations.
Changes
Changes in version 0.13.2.0
- Strict boxed vector
Data.Vector.StrictandData.Vector.Strict.Mutableis added (#488). it ensures that all values in the vector are evaluated to WHNF. DoNotUnboxStrict,DoNotUnboxLazy, andDoNotUnboxNormalFormwrapper are added for defining unbox instances for types that contain not unboxable fields. #503, #508spanRandbreakRwere added #476. They allow parsing vector from the right.- We had some improvements on
*.Mutable.{next,prev}Permutation{,By}#498:- Add
*.Mutable.prevPermutation{,By}and*.Mutable.nextPermutationBy - Improve time performance. We may now expect good specialization supported by inlining.
The implementation has also been algorithmically updated: in the previous implementation
the full enumeration of all the permutations of
[1..n]took Omega(n*n!), but it now takes O(n!). - Add tests for
{next,prev}Permutation - Add benchmarks for
{next,prev}Permutation
- Add
- Cabal >= 3.0 is now required for building package (#481).
vector:benchmarks-O2public sublibrary containing benchmarks is added (#481).- Type family
Mutableprovides instances for arrays fromprimitive. - Various documentation improvements.
Changes in version 0.13.1.0
- Specialized variants of
findIndexRare reexported for all vector types. #469 UnboxViaPrimcould be used for derivingUnboxinstances (V_UnboxViaPrimconstructor is exported) #450- Fields of
Data.Vector.Fusion.Bundle.Sizeare now strict #456 - Compatibility with future GHC 9.10 release #462
- Test suite no longer fails when built with QuickCheck-2.14 #461
- Doctests now work with current versions of GHC #465
- Various documentation improvements
Changes in version 0.13.0.0
mkTypefromData.Vector.Genericis deprecated in favor ofData.Data.mkNoRepType- The role signatures on several
Vectortypes were too permissive, so they have been tightened up:-
The role signature for
Data.Vector.Mutable.MVectoris nowtype role MVector nominal representational(previously, both arguments werephantom). #224 -
The role signature for
Data.Vector.Primitive.Vectoris nowtype role Vector nominal(previously, it wasphantom). The role signature forData.Vector.Primitive.Mutable.MVectoris nowtype role MVector nominal nominal(previously, both arguments werephantom). #316 -
The role signature for
Data.Vector.Storable.Vectoris nowtype role Vector nominal(previous, it wasphantom), and the signature forData.Vector.Storable.Mutable.MVectoris nowtype role MVector nominal nominal(previous, both arguments werephantom). #235We pick
nominalfor the role of the last argument instead ofrepresentationalsince the internal structure of aStorablevector is determined by theStorableinstance of the element type, and it is not guaranteed that theStorableinstances between two representationally equal types will preserve this internal structure. One consequence of this choice is that it is no longer possible tocoercebetweenStorable.Vector aandStorable.Vector bifaandbare nominally distinct but representationally equal types. We now provideunsafeCoerce{M}VectorandunsafeCastfunctions to allow this (the onus is on the user to ensure that noStorableinvariants are broken when using these functions).
-
- Methods of type classes
Data.Vector.Generic.Mutable.MVectorandData.Vector.Generic.Vectoruse concrete monads (ST, etc) istead of being polymorphic (PrimMonad, etc). #335. This makes it possible to deriveUnboxwith:GeneralizedNewtypeDeriving- via
UnboxViaPrimandPriminstance - via
AsandIsoUnboxinstance: #378
- Add
MonadFixinstance for boxed vectors: #312 - Re-export
PrimMonadandRealWorldfrom mutable vectors: #320 - Add
maximumOnandminimumOn: #356 - The functions
scanl1,scanl1',scanr1, andscanr1'for immutable vectors are now defined when given empty vectors as arguments, in which case they return empty vectors. This new behavior is consistent with the one of the corresponding functions inData.List. Prior to this change, applying an empty vector to any of those functions resulted in an error. This change was introduced in: #382 - Change allocation strategy for
unfoldrN: #387 - Remove
CPPdriven error reporting in favor ofHasCallStack: #397 - Remove redundant
Storableconstraints on to/fromForeignPtrconversions: #394 - Add
unsafeCasttoPrimitivevectors: #401 - Make
(!?)operator strict: #402 - Add
readMaybe: #425 - Add
groupByandgroupforData.Vector.Genericand the specialized version inData.Vector,Data.Vector.Unboxed,Data.Vector.StorableandData.Vector.Primitive. #427 - Add
toArraySliceandunsafeFromArraySlicefunctions for conversion to and from the underlying boxedArray: #434
Changes in version 0.12.3.1
- Bugfix for ghcjs and
Doublememset forStorablevector: #410 - Avoid haddock bug: #383
- Improve haddock and doctests
- Disable problematic tests with -boundschecks #407
Changes in version 0.12.3.0
-
Fix performance regression due to introduction of
keepAlive#primop in ghc-9.0: #372 -
Add monadic functions for mutable vectors: #338
- Added folds for monadic functions:
mapM_,imapM_,forM_,iforM_,foldl,foldl',foldM,foldM',ifoldl,ifoldl',ifoldM,ifoldM' - Added
modifyMandunsafeModifyMfor mutable vectors - Added
generateandgenerateMfor mutable vectors
- Added folds for monadic functions:
Changes in version 0.12.2.0
- Add
MINIMALpragma toVector&MVectortype classes: #11 - Export
unstreamMfromfrom Data.Vector.Generic: #70 - Added
unfoldrExactNandunfoldrExactNM: #140 - Added
iforMandiforM_: #262 - Added
MonadFixinstance for boxed vectors: #178 - Added
unconsandunsnoc: #212 - Added
foldMapandfoldMap': #263 - Added
isSameVectorfor storable vectors - Added
toArray,fromArray,toMutableArrayandfromMutableArray - Added
iscanl,iscanl',iscanr,iscanr'toPrimitive,StorableandUnboxed - Added
izipWithM,izipWithM_,imapMandimapM_toPrimitiveandStorable - Added
ifoldM,ifoldM',ifoldM_andifoldM'_toPrimitiveandStorable - Added
eqByandcmpBy - Added
findIndexRtoGeneric: #172 - Added
catMaybes: #329 - Added
mapMaybeMandimapMaybeM: #183
Changes in version 0.12.1.2
- Fix for lost function
Data.Vector.Generic.mkType: #287
Changes in version 0.12.1.1 (deprecated)
- add semigrioups dep to test suite so CI actually runs again on GHC < 8
Changes in version 0.12.1.0 (deprecated)
- Fix integer overflows in specializations of Bundle/Stream enumFromTo on Integral types
- Fix possibility of OutOfMemory with
takeand very large arguments. - Fix
slicefunction causing segfault and not checking the bounds properly. - updated specialization rule for EnumFromTo on Float and Double to make sure it always matches the version in GHC Base (which changed as of 8.6) Thanks to Aleksey Khudyakov @Shimuuar for this fix.
- fast rejection short circuiting in eqBy operations
- the O2 test suite now has reasonable memory usage on every GHC version, special thanks to Alexey Kuleshevich (@lehins).
- The
Mutabletype family is now injective on GHC 8.0 or later. - Using empty
Storablevectors no longer results in division-by-zero errors. - The
Datainstances forVectortypes now have well defined implementations fortoConstr,gunfold, anddataTypeOf. - New function:
partitionWith. - Add
Unboxinstances forIdentity,Const,Down,Dual,Sum,Product,Min,Max,First,Last,WrappedMonoid,Arg,Any,All,Alt, andCompose. - Add
NFData1instances for applicableVectortypes.
Changes in version 0.12.0.3
- Monad Fail support
Changes in version 0.12.0.2
- Fixes issue #220, compact heap operations crashing on boxed vectors constructed using traverse.
- backport injective type family support
- Cleanup the memset code internal to storable vector modules to be compatible with future Primitive releases
Changes in version 0.12.0.1
- Make sure
lengthcan be inlined - Include modules that test-suites depend on in other-modules
Changes in version 0.12.0.0
- Documentation fixes/additions
- New functions: createT, iscanl/r, iterateNM, unfoldrM, uniq
- New instances for various vector types: Semigroup, MonadZip
- Made
Storablevectors respect memory alignment - Changed some macros to ConstraintKinds
- Dropped compatibility with old GHCs to support this
- Add
Eq1,Ord1,Show1, andRead1Vectorinstances, and related helper functions. - Relax context for
Unbox (Complex a).
Changes in version 0.11.0.0
- Define
Applicativeinstances forData.Vector.Fusion.Util.{Box,Id} - Define non-bottom
failforinstance Monad Vector - New generalized stream fusion framework
- Various safety fixes
- Various overflows due to vector size have been eliminated
- Memory is initialized on creation of unboxed vectors
- Changes to SPEC usage to allow building under more conditions
Changes in version 0.10.12.3
- Allow building with
primtive-0.6
Changes in version 0.10.12.2
- Add support for
deepseq-1.4.0.0
Changes in version 0.10.12.1
- Fixed compilation on non-head GHCs
Changes in version 0.10.12.0
-
Export MVector constructor from Data.Vector.Primitive to match Vector’s (which was already exported).
-
Fix building on GHC 7.9 by adding Applicative instances for Id and Box
Changes in version 0.10.11.0
- Support OverloadedLists for boxed Vector in GHC >= 7.8
Changes in version 0.10.10.0
- Minor version bump to rectify PVP violation occured in 0.10.9.3 release
Changes in version 0.10.9.3 (deprecated)
- Add support for OverloadedLists in GHC >= 7.8
Changes in version 0.10.9.2
- Fix compilation with GHC 7.9
Changes in version 0.10.9.1
- Implement poly-kinded Typeable
Changes in version 0.10.0.1
- Require
primitiveto include workaround for a GHC array copying bug
Changes in version 0.10
NFDatainstances- More efficient block fills
- Safe Haskell support removed