Data.HalfInteger
Description
This module provides efficient half-integers. That is, normal integers and integers plus or minus 1/2. These are sometimes useful for when a value can be an integer, or midway between two integers.
- data HalfInteger i
- half :: Integral i => HalfInteger i
- halve :: Integral i => i -> HalfInteger i
- double :: HalfInteger i -> i
- toHalfInteger :: (RealFrac x, Integral i) => x -> HalfInteger i
- fromHalfInteger :: (Integral i, Fractional x) => HalfInteger i -> x
- isInteger :: Integral i => HalfInteger i -> Bool
Documentation
data HalfInteger i Source
The type of half-integers. The bounds are determined by the type
variable. For example, HalfInteger Int has a range half as large
as Int itself. (The Bounded instance correctly reflects this.)
Note that HalfInteger Integer is unbounded, like Integer
itself.
HalfInteger values can be constructed as numeric literals
(e.g., 5 :: HalfInteger Int), by conversions such as
fromInteger or fromIntegral, or by several functions in this
module. Another common pattern is to write (say) 5 + half to
represent 5 1/2. Indeed, the Show instance represents values
in this way.
Beware: The half-integers are not closed under multiplication!
For example, half * half should yield 1/4, which is not a valid
HalfInteger. (Currently it yields zero.) Addition and
subtraction, however, are closed, and thus yield exact results.
Instances
| Bounded i => Bounded (HalfInteger i) | |
| Eq i => Eq (HalfInteger i) | |
| Integral i => Num (HalfInteger i) | |
| Ord i => Ord (HalfInteger i) | |
| Integral i => Show (HalfInteger i) |
half :: Integral i => HalfInteger iSource
Represents 1/2 as a HalfInteger. You can add this to integral
HalfInteger values created in various ways to get the
half-part in.
halve :: Integral i => i -> HalfInteger iSource
Take an integer and halve its value, yielding a HalfInteger.
This conversion is always exact, and halve . double == id.
double :: HalfInteger i -> iSource
Take a HalfInteger and double its value, yielding a normal integer.
This conversion is always exact, and double . halve == id.
toHalfInteger :: (RealFrac x, Integral i) => x -> HalfInteger iSource
Convert any number into a HalfInteger. The rounding is somewhat
unpredictable, but any value exactly representable as a half integer
will be converted exactly.
fromHalfInteger :: (Integral i, Fractional x) => HalfInteger i -> xSource
Convert a HalfInteger into some other kind of number.
This conversion is always exact.
isInteger :: Integral i => HalfInteger i -> BoolSource
Returns True if this HalfInteger can be exactly represented
as an ordinary integer, and False if there is a half offset.