vec-0.5: vec.cabal
cabal-version: 2.2
name: vec
version: 0.5
synopsis: Vec: length-indexed (sized) list
category: Data, Dependent Types
description:
This package provides length-indexed (sized) lists, also known as vectors.
.
@
data Vec n a where
\ VNil :: Vec 'Nat.Z a
\ (:::) :: a -> Vec n a -> Vec ('Nat.S n) a
@
.
The functions are implemented in four flavours:
.
* __naive__: with explicit recursion. It's simple, constraint-less, yet slow.
.
* __pull__: using @Fin n -> a@ representation, which fuses well,
but makes some programs hard to write. And
.
* __data-family__: which allows lazy pattern matching
.
* __inline__: which exploits how GHC dictionary inlining works, unrolling
recursion if the size of 'Vec' is known statically.
.
As best approach depends on the application, @vec@ doesn't do any magic
transformation. Benchmark your code.
.
This package uses [fin](https://hackage.haskell.org/package/fin), i.e. not @GHC.TypeLits@, for indexes.
.
For @lens@ or @optics@ support see [vec-lens](https://hackage.haskell.org/package/vec-lens) and [vec-optics](https://hackage.haskell.org/package/vec-optics) packages respectively.
.
See [Hasochism: the pleasure and pain of dependently typed haskell programming](https://doi.org/10.1145/2503778.2503786)
by Sam Lindley and Conor McBride for answers to /how/ and /why/.
Read [APLicative Programming with Naperian Functors](https://doi.org/10.1007/978-3-662-54434-1_21)
by Jeremy Gibbons for (not so) different ones.
.
=== Similar packages
.
* [linear](https://hackage.haskell.org/package/linear) has 'V' type,
which uses 'Vector' from @vector@ package as backing store.
@Vec@ is a real GADT, but tries to provide as many useful instances (upto @lens@).
.
* [vector-sized](https://hackage.haskell.org/package/vector-sized)
Great package using @GHC.TypeLits@. Current version (0.6.1.0) uses
@finite-typelits@ and @Int@ indexes.
.
* [sized-vector](https://hackage.haskell.org/package/sized-vector) depends
on @singletons@ package. @vec@ isn't light on dependencies either,
but try to provide wide GHC support.
.
* [fixed-vector](https://hackage.haskell.org/package/fixed-vector)
.
* [sized](https://hackage.haskell.org/package/sized) also depends
on a @singletons@ package. The @Sized f n a@ type is generalisation of
@linear@'s @V@ for any @ListLike@.
.
* [clash-prelude](https://hackage.haskell.org/package/clash-prelude)
is a kitchen sink package, which has @CLaSH.Sized.Vector@ module.
Also depends on @singletons@.
homepage: https://github.com/phadej/vec
bug-reports: https://github.com/phadej/vec/issues
license: BSD-3-Clause
license-file: LICENSE
author: Oleg Grenrus <oleg.grenrus@iki.fi>
maintainer: Oleg.Grenrus <oleg.grenrus@iki.fi>
copyright: (c) 2017-2021 Oleg Grenrus
build-type: Simple
extra-source-files: ChangeLog.md
tested-with:
GHC ==7.8.4
|| ==7.10.3
|| ==8.0.2
|| ==8.2.2
|| ==8.4.4
|| ==8.6.5
|| ==8.8.4
|| ==8.10.7
|| ==9.0.2
|| ==9.2.7
|| ==9.4.4
|| ==9.6.1
source-repository head
type: git
location: https://github.com/phadej/vec.git
subdir: vec
flag adjunctions
description: Depend on @adjunctions@ to provide its instances
manual: True
default: True
flag distributive
description:
Depend on @distributive@ to provide its instances. Turning on, disables @adjunctions@ too.
manual: True
default: True
flag semigroupoids
description:
Depend on @semigroupoids@ to provide its instances, and `traverse1`.
manual: True
default: True
library
default-language: Haskell2010
ghc-options: -Wall -fprint-explicit-kinds
hs-source-dirs: src
exposed-modules:
Data.Vec.DataFamily.SpineStrict
Data.Vec.Lazy
Data.Vec.Lazy.Inline
Data.Vec.Pull
other-modules:
Control.Lens.Yocto
SafeCompat
-- GHC boot libs
build-depends:
, base >=4.7 && <4.19
, deepseq >=1.3.0.1 && <1.5
, transformers >=0.3.0.0 && <0.7
if !impl(ghc >=8.0)
build-depends: semigroups >=0.18.4 && <0.21
-- Ensure Data.Functor.Classes is always available
if impl(ghc >=7.10)
build-depends: transformers >=0.4.2.0
else
build-depends: transformers-compat ^>=0.6.5 || ^>=0.7.1
-- siblings
build-depends: fin ^>=0.3
-- other dependencies
build-depends:
, boring ^>=0.2
, hashable >=1.2.7.0 && <1.5
, indexed-traversable ^>=0.1.1
, QuickCheck ^>=2.14.2
if flag(distributive)
build-depends: distributive >=0.5.3 && <0.7
if flag(adjunctions)
build-depends: adjunctions ^>=4.4
if flag(semigroupoids)
build-depends: semigroupoids ^>=5.3.5 || ^>=6
other-extensions:
CPP
FlexibleContexts
GADTs
TypeOperators
if impl(ghc >=9.0)
-- these flags may abort compilation with GHC-8.10
-- https://gitlab.haskell.org/ghc/ghc/-/merge_requests/3295
ghc-options: -Winferred-safe-imports -Wmissing-safe-haskell-mode
x-docspec-extra-packages: void
x-docspec-extra-packages: lens
test-suite inspection
type: exitcode-stdio-1.0
main-is: Main.hs
other-modules:
Inspection
Inspection.DataFamily.SpineStrict
ghc-options: -Wall -fprint-explicit-kinds
hs-source-dirs: test
default-language: Haskell2010
build-depends:
, base
, base-compat
, fin
, inspection-testing ^>=0.4.2.2 || ^>=0.5.0.1
, tagged
, vec
if !impl(ghc >=8.0)
buildable: False
benchmark bench
type: exitcode-stdio-1.0
main-is: Bench.hs
ghc-options: -Wall -fprint-explicit-kinds
hs-source-dirs: bench
default-language: Haskell2010
other-modules: DotProduct
build-depends:
, base
, criterion >=1.4.0.0 && <1.7
, fin
, vec
, vector