Haskell has two options for polymorphism:
- parametric polymorphism; and
- limited polymorphism
The first is the most general - a function is parametrically polymorphic if it behaves uniformly for all types, at least in one of its type parameters.
For example, the length function is polymorphic - it returns the length of the list, regardless of what type is stored in its list.
length :: [a] -> Int
Polymorphism is denoted by a variable of the lower case type.
Now, if you have custom behavior that you want to have for a specific set of types, then you have limited polymorphism (also known as "ad hoc"). At Haskell, we use type classes for this.
The class declares which function will be available on a set of types:
class FunnyShow a where funnyshow :: a -> String
and then you can define instances for each type you care about:
instance FunnyShow Int where funnyshow i = show (i+1)
and, perhaps:
instance FunnyShow [Char] where funnyshow s = show (show s)
source share