Representations of C types

These types are needed to accurately represent C function prototypes,
in order to access C library interfaces in Haskell. The Haskell system
is not required to represent those types exactly as C does, but the
following guarantees are provided concerning a Haskell type CT
representing a C type t:

If a C function prototype has t as an argument or result type, the
use of CT in the corresponding position in a foreign declaration
permits the Haskell program to access the full range of values encoded
by the C type; and conversely, any Haskell value for CT has a valid
representation in C.

The members peek and poke of the Storable class map all values
of CT to the corresponding value of t and vice versa.

When an instance of Bounded is defined for CT, the values
of minBound and maxBound coincide with t_MIN
and t_MAX in C.

When an instance of Eq or Ord is defined for CT,
the predicates defined by the type class implement the same relation
as the corresponding predicate in C on t.

When an instance of Num, Read, Integral,
Fractional, Floating, RealFrac, or
RealFloat is defined for CT, the arithmetic operations
defined by the type class implement the same function as the
corresponding arithmetic operations (if available) in C on t.

When an instance of Bits is defined for CT, the bitwise operation
defined by the type class implement the same function as the
corresponding bitwise operation in C on t.