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 examples are:

  • Range: Allow dynamic choice of lower and upper array bounds such as in the Arrays 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.

  • (:+:): The Append type constructor allows to respresent block arrays, e.g. block matrices.

  • Enumeration: Arrays with indices like LT, EQ, GT and dummy shape.

  • Set: Use an arbitrary ordered set as index set.

  • Triangular: A 2D array with the shape of lower or upper triangular matrix.

The lapack package defines even more fancy shapes like tall rectangular matrices, triangular matrices and banded matrices.


Change log for the comfort-array package


  • Storable.Mutable.Array: Replace ForeignPtr by Array.Guarded.MutablePtr. In the last release we altered the arrays after initialization which corrupted the debugging by the guarded-allocation package. This should be fixed now.

  • Shape.sizeOffset: It does not return a single offset anymore but an offset computation function. This allows to cache a size computation across many offset computations.


  • Add a monad parameter to the mutable Storable array type and generalize functions to PrimMonads. This way the mutating functions can also be used in the ST monad.


  • Add immutable Boxed array type and mutable Storable array type.


  • Split Shape.C into Shape.C and Shape.Indexed.


  • Initial version featuring the Shape.C class with type function Index and the immutable Storable array type.
comments powered byDisqus