The Ix class is used to map a contiguous subrange of values in
a type onto integers. It is used primarily for array indexing
(see the array package).
The first argument (l,u) of each of these operations is a pair
specifying the lower and upper bounds of a contiguous subrange of values.
An implementation is entitled to assume the following laws about these
inRange (l,u) i == elem i (range (l,u))
- range (l,u) !! index (l,u) i == i, when inRange (l,u) i
map (index (l,u)) (range (l,u))) == [0..rangeSize (l,u)-1]
rangeSize (l,u) == length (range (l,u))
Minimal complete instance: range, index and inRange.
|The list of values in the subrange defined by a bounding pair.
|The position of a subscript in the subrange.
|Returns True the given subscript lies in the range defined
the bounding pair.
|The size of the subrange defined by a bounding pair.
|(Ix a, Ix b) => Ix (a, b)|
|(Ix a1, Ix a2, Ix a3) => Ix (a1, a2, a3)|
|(Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1, a2, a3, a4)|
|(Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1, a2, a3, a4, a5)|
Derived instance declarations for the class Ix are only possible
for enumerations (i.e. datatypes having only nullary constructors)
and single-constructor datatypes, including arbitrarily large tuples,
whose constituent types are instances of Ix.
- For an enumeration, the nullary constructors are assumed to be
numbered left-to-right with the indices being 0 to n-1 inclusive. This
is the same numbering defined by the Enum class. For example, given
data Colour = Red | Orange | Yellow | Green | Blue | Indigo | Violet
we would have:
range (Yellow,Blue) == [Yellow,Green,Blue]
index (Yellow,Blue) Green == 1
inRange (Yellow,Blue) Red == False