Em Haskell é possível usar o mesmo identificador para funções computacionalmente distintas. A isto chama-se sobrecarga (overloading) de funções.
Ao nível do sistema de tipos a sobrecarga de funções é tratada introduzindo o conceito de classe e tipos qualificados.
Considere os seguintes exemplos :
> 3 + 2
5
> 10.5 + 1.7
12.2
Qual será o tipo da soma (+) ? ⇒ a → a → a é um tipo demasiado permissivo pois não é possível somar elementos de qualquer tipo : > 'a' + 'b' ⇒ error ...
O Haskell resolve o problema com restrições de classes
(+) :: Num a => a -> a -> a ⇒ Para qualquer tipo numérico a, a função (+) recebe dois valores do tipo a e devolve um valor do tipo a
Uma função polimórfica diz-se sobrecarregada se o seu tipo contém uma ou mais restrições de classes
(+) :: Num a => a -> a -> a
> 3 + 2
5
> 10.5 + 1.7
12.2
> ’a’ + ‘b’
error: …
a = Int
a = Float
Char não é numérico
Mais exemplos :
sum :: Num a => [a] -> a
(*) :: Num a => a -> a -> a
product :: Num a => [a] -> a