Arrays from the basic array package are already very powerful
compared with arrays in other languages.
They may have any number of dimensions, are type safe
and defined in a uniform way using the Ix class
with free choice of the lower bounds (0, 1, or whatever you like).
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.
Some Shape example types are:
- Range:
Allow dynamic choice of lower and upper array bounds
such as in the- Arrays from the- arraypackage.
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- Wordcannot represent- -1and 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,- GTand a shape of fixed size.
 
- NestedTuple:
Arrays with shapes that are compatible to nested tuples
like- (a,(a,a))and indices like- fstand- 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.
In a higher dimensional array it can be used for block matrices
with a dynamic number of blocks but block sizes of the same shape type.
 
- 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.
 
With our Array type you can perform
- Fast Linear Algebra using the packages - comfort-blasand- lapack.
The- lapackpackage defines even more fancy shapes
like tall rectangular matrices, triangular matrices and banded matrices.
 
- Fast Fourier Transforms using the package - comfort-fftw
 
- Fast Linear Programming using the packages
- comfort-glpk,- coinor-clp,- highs-lp
 
- Efficient Array Processing via LLVM Just-In-Time code generation
using the package - knead.
 
See also comfort-graph for a Graph data structure,
with non-Int node identifiers and flexible edge types.