vector
Efficient Arrays
https://github.com/haskell/vector
| Version on this page: | 0.13.2.0@rev:1 | 
| LTS Haskell 24.17: | 0.13.2.0@rev:2 | 
| Stackage Nightly 2025-10-31: | 0.13.2.0@rev:2 | 
| Latest on Hackage: | 0.13.2.0@rev:2 | 
vector-0.13.2.0@sha256:b736a57b73520d2acf4865e3e2b40030d69782f35f870e376dc717ee2508d81f,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, and- DoNotUnboxNormalFormwrapper are added for defining unbox instances for types that contain not unboxable fields. #503, #508
- spanRand- breakRwere 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 deriving- Unboxinstances (- 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
- mkTypefrom- Data.Vector.Genericis deprecated in favor of- Data.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
