This package goes one step further:
The shape and the index type are different,
but the index type is a type function of the shape type.
This offers much more flexibility and type safety.
Range
:
Allow dynamic choice of lower and upper array bounds
such as in the Array
s from the array
package.
You can combine it with other shapes in other dimensions.
It allows you to describe the bounds of each dimension individually.
Shifted
:
Describe array bounds by start index and length.
It is sometimes more natural to use these parameters.
E.g. a non-negative index type like Word
cannot represent -1
and thus cannot encode an empty range starting with index 0
.
ZeroBased, OneBased
:
Arrays with fixed lower bound, either 0 or 1, respectively.
Cyclic
:
Indices with wrap-around semantics.
Zero, ()
:
Arrays with fixed size 0 or 1, respectively.
Enumeration
:
Arrays with indices like LT
, EQ
, GT
and a shape of fixed size.
NestedTuple
:
Arrays with shapes that are compatible to nested tuples
like (a,(a,a))
and indices like fst
and fst.snd
.
(::+)
:
The Append type constructor allows to respresent block arrays,
e.g. block matrices.
It also allows to represent non-empty arrays via ()::+sh
.
Set
: Use an arbitrary ordered set as index set.
Map
: Concatenate a set of shapes.
Triangular
:
A 2D array with the shape of a lower or upper triangular matrix.
Simplex
:
Simplices of any dimension, where the dimension is encoded in the type.
An index is a tuple of monotonic ordered sub-indices.
Square
: A 2D array where both dimensions always have equal size.
Cube
: A 3D array where all three dimensions always have equal size.
Tagged
: Statically distinguish shapes and indices that are isomorphic.