\begin{hcarentry}[updated]{Numeric prelude}
\label{numericprelude}
\report{Henning Thielemann}%05/08
\status{experimental, active development}
\participants{Dylan Thurston, Mikael Johansson}
\makeheader
The hierarchy of numerical type classes is revised and oriented at algebraic
structures. Axiomatics for fundamental operations are given as
QuickCheck properties, superfluous super-classes like
\texttt{Show} are removed, semantic and representation-specific operations are
separated, the hierarchy of type classes is more fine grained, and identifiers
are adapted to mathematical terms.
There are both certain new type classes
representing algebraic structures
and new types of mathematical objects.
Currently supported algebraic structures are
\begin{compactitem}
\item group (additive),
\item ring,
\item principal ideal domain,
\item field,
\item algebraic closures,
\item transcendental closures,
\item module and vector space,
\item normed space,
\item lattice,
\item differential algebra,
\item monoid.
\end{compactitem}
There is also a collection of mathematical object types,
which is useful both for applications and
testing the class hierarchy.
The types are
\begin{compactitem}
\item lazy Peano number,
\item complex number, quaternion,
\item residue class,
\item fraction,
\item partial fraction,
\item numbers equipped with physical units in two variants:
\begin{enumerate}
\item dynamically checked units,
\item statically checked dimension terms
(E.g., speed can be expressed by type argument \verb|Mul Length (Recip Time)|.
This is overly restrictive but does not require type extensions.)
\end{enumerate}
\item fixed point arithmetic with respect to arbitrary bases and numbers of fraction digits,
\item infinite precision number in an arbitrary positional system as lazy lists of digits
supporting also numbers with terminating representations,
\item polynomial, power series, \textsc{Laurent} series
\item root set of a polynomial,
\item matrix (basics only),
\item algebra, e.g., multi-variate polynomial (basics only),
\item permutation group.
\end{compactitem}
Due to Haskell's flexible type system,
you can combine all these types,
e.g., fractions of polynomials, residue classes of polynomials,
complex numbers with physical units,
power series with real numbers as coefficients.
Using the revised system requires hiding some of the standard functions
provided by Prelude, which is fortunately supported by GHC.
The library has basic Cabal support
and a growing test-suite of QuickCheck tests
for the implemented mathematical objects.
Each data type now resides in a separate module.
Cyclic dependencies could be eliminated by fixing some types in class methods.
E.g., power exponents became simply Integer instead of Integral,
which has also the advantage of reduced type defaulting.
\FuturePlans
Collect more Haskell code related to mathematics, e.g., for linear algebra.
Study of alternative numeric type class proposals and
common computer algebra systems.
A still unsolved problem arises for
residue classes, matrix computations, infinite precision numbers,
fixed point numbers, and others.
It should be possible to assert statically
that the arguments of a function are residue classes with
respect to the same divisor, or that they are vectors of the same size.
Possible ways out are encoding values in types or local type
class instances. The latter one is still neither proposed nor
implemented in any Haskell compiler.
The modules are implemented in a way to keep all options open.
That is, for each number type there is one module
implementing the necessary operations
which expect the context as a parameter.
Then there are several modules
which provide different interfaces through type class instances
to these operations.
\FurtherReading
\url{http://darcs.haskell.org/numericprelude/}
\end{hcarentry}