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