I just wrote a small module for dealing with half-integers. (That is, any number I/2 where I is an integer. Note that the set of integers is a subset of this; Wikipedia seems to reserve "half-integer" for such numbers that are *not* integers.)

 module HalfInteger where

 data HalfInteger i

 instance (Eq i) => Eq (HalfInteger i)
 instance (Ord i) => Ord (HalfInteger i)
 instance (Integral i) => Show (HalfInteger i)
 instance (Integral i) => Num (HalfInteger i)

 half :: (Num i) => HalfInteger i

 fromNum :: (Integral i, RealFrac x) => x -> HalfInteger i
 toNum :: (Integral i, Fractional x) => HalfInteger i -> x

 isInteger :: (Integral i) => HalfInteger i -> Bool

Note carefully that the set of half-integers is *not* closed under multiplication! This means that for certain arguments, there are two reasonable products that could be returned. (E.g., 1/2 * 1/2 = 1/4, so 0 or 1/2 would be a reasonable rounding.) I haven't put a lot of effort into the rounding details of (*) or fromNum; which answer you get is kind of arbitrary. (However, addition and subtraction are exact, and for multiplications where an exact result is possible, you will get that result.)

The Show instance outputs strings such as

 fromInteger 5
 fromInteger 5 + half
 fromInteger (-5) - half

depending on the isInteger predicate.

Now, the question is... Is this useful enough to be worth putting on Hackage?

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to