- class Ord a => DiscreteOrdered a where
- enumAdjacent :: (Ord a, Enum a) => a -> a -> Bool
- boundedAdjacent :: (Ord a, Enum a) => a -> a -> Bool
- boundedBelow :: (Eq a, Enum a, Bounded a) => a -> Maybe a
- data Boundary a
- above :: Ord v => Boundary v -> v -> Bool
- (/>/) :: Ord v => v -> Boundary v -> Bool
Distinguish between dense and sparse ordered types. A dense type is
one in which any two values
v1 < v2 have a third value
v3 such that
v1 < v3 < v2.
In theory the floating types are dense, although in practice they can only have finitely many values. This class treats them as dense.
Tuples up to 4 members are declared as instances. Larger tuples may be added if necessary.
Most values of sparse types have an
adjacentBelow, such that, for all x:
case adjacentBelow x of Just x1 -> adjacent x1 x Nothing -> True
The exception is for bounded types when
x == lowerBound. For dense types
adjacentBelow always returns
This approach was suggested by Ben Rudiak-Gould on comp.lang.functional.
y are adjacent if
x < y and there does not
exist a third value between them. Always
False for dense types.
The value immediately below the argument, if it can be determined.
|Ord a => DiscreteOrdered [a]|
|Integral a => DiscreteOrdered (Ratio a)|
|(Ord a, DiscreteOrdered b) => DiscreteOrdered (a, b)|
|(Ord a, Ord b, DiscreteOrdered c) => DiscreteOrdered (a, b, c)|
|(Ord a, Ord b, Ord c, DiscreteOrdered d) => DiscreteOrdered (a, b, c, d)|
Check adjacency for sparse enumerated types (i.e. where there
is no value between
Check adjacency, allowing for case where x = maxBound. Use as the definition of adjacent for bounded enumerated types such as Int and Char.
The usual implementation of
adjacentBelow for bounded enumerated types.
A Boundary is a division of an ordered type into values above and below the boundary. No value can sit on a boundary.
Known bug: for Bounded types
BoundaryAbove maxBound < BoundaryAboveAll
BoundaryBelow minBound > BoundaryBelowAll
This is incorrect because there are no possible values in between the left and right sides of these inequalities.
The argument is the highest value below the boundary.
The argument is the lowest value above the boundary.
The boundary above all values.
The boundary below all values.
True if the value is above the boundary, false otherwise.