[Haskell-cafe] Half-integer

Andrew Coppin andrewcoppin at btinternet.com
Sun Jun 28 09:24:30 EDT 2009

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 

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 

More information about the Haskell-Cafe mailing list