This library provides unsigned integers of various sizes. The types supported are as follows: type | number of bits @ Word8 | 8 @ Word16 | 16 @ Word32 | 32 @ Word64 | 64 @ For each type data W -- Unsigned Ints instance Eq W instance Ord W instance Show W instance Read W instance Bounded W instance Num W instance Real W instance Integral W instance Enum W instance Ix W instance Bits W Plus word8ToWord16 :: Word8 -> Word16 word8ToWord32 :: Word8 -> Word32 word8ToWord64 :: Word8 -> Word64 word16ToWord8 :: Word16 -> Word8 word16ToWord32 :: Word16 -> Word32 word16ToWord64 :: Word16 -> Word64 word32ToWord8 :: Word32 -> Word8 word32ToWord16 :: Word32 -> Word16 word32ToWord64 :: Word32 -> Word64 word64ToWord8 :: Word64 -> Word8 word64ToWord16 :: Word64 -> Word16 word64ToWord32 :: Word64 -> Word32 word8ToInt :: Word8 -> Int word16ToInt :: Word16 -> Int word32ToInt :: Word32 -> Int word64ToInt :: Word64 -> Int intToWord8 :: Int -> Word8 intToWord16 :: Int -> Word16 intToWord32 :: Int -> Word32 intToWord64 :: Int -> Word64 word64ToInteger :: Word64 -> Integer integerToWord64 :: Integer -> Word64 Notes: All arithmetic is performed modulo 2^n One non-obvious consequence of this is that The coercion Use a -> b/ to coerce between different sizes or to preserve sign when converting between values of the same size. It would be very natural to add a type a type The rules that hold for Right and left shifts by amounts greater than or equal to the width of the type result in a zero result. This is contrary to the behaviour in C, which is undefined; a common interpretation is to truncate the shift count to the width of the type, for example 1 << 32 == 1 in some C implementations. Hugs only provides