- Another type of polymorphism is \emph{ad-hoc
- polymorphism}~\cite{polymorphism}, which refers to polymorphic
- functions which can be applied to arguments of different types, but which
- behave differently depending on the type of the argument to which they are
- applied. In Haskell, ad-hoc polymorphism is achieved through the use of
- \emph{type classes}, where a class definition provides the general
- interface of a function, and class \emph{instances} define the
- functionality for the specific types. An example of such a type class is
- the \hs{Num} class, which contains all of Haskell's numerical operations.
- A designer can make use of this ad-hoc polymorphism by adding a
- \emph{constraint} to a parametrically polymorphic type variable. Such a
- constraint indicates that the type variable can only be instantiated to a
- type whose members supports the overloaded functions associated with the
- type class.
+ % Another type of polymorphism is \emph{ad-hoc
+ % polymorphism}~\cite{polymorphism}, which refers to polymorphic
+ % functions which can be applied to arguments of different types, but
+ % which behave differently depending on the type of the argument to which
+ % they are applied. In Haskell, ad-hoc polymorphism is achieved through
+ % the use of \emph{type classes}, where a class definition provides the
+ % general interface of a function, and class \emph{instances} define the
+ % functionality for the specific types. An example of such a type class is
+ % the \hs{Num} class, which contains all of Haskell's numerical
+ % operations. A designer can make use of this ad-hoc polymorphism by
+ % adding a \emph{constraint} to a parametrically polymorphic type
+ % variable. Such a constraint indicates that the type variable can only be
+ % instantiated to a type whose members supports the overloaded functions
+ % associated with the type class.
+
+ Another type of polymorphism is \emph{ad-hoc polymorphism}, which refers
+ to function that can be applied to arguments of a limited set to types.
+ Furthermore, how such functions work may depend on the type of their
+ arguments. For example, addition only works for numeric types, and it
+ works differently for e.g. integers and complex numbers.
+
+ In Haskell, ad-hoc polymorphism is achieved through the use of \emph{type
+ classes}, where a class definition provides the general interface of a
+ function, and class \emph{instances} define the functionality for the
+ specific types. For example, all numeric types are gathered in the
+ \hs{Num} class, and the type of \emph{addition} is expressed by prefixing
+ by prefixing the type signature with a constraint on the type parameter: