Há funções às quais é possível associar mais do que um tipo concreto. Por exemplo, a função length (que calcula o comprimento de uma lista) pode ser aplicada a quaisquer listas independentemente do tipo dos seus elementos
> length [3,2,2,1,4]
5
> length [True,False]
2
Um função diz-se polimórfica se o seu tipo contém variáveis de tipo (representadas por letras minúsculas)
length :: [a] -> Int
Para qualquer tipo a, a função length recebe uma lista de valores do tipo a e devolve um inteiro
> length [3,2,2,1,4]
5
> length [True,False]
2
a = Int
a = Bool
A maioria das funções da biblioteca Prelude são polimórficas :
head :: [a] -> a Pega no primeiro elemento da lista
tail :: [a] -> [a] Pega em todos os elementos, menos o primeiro, de uma lista
take :: Int -> [a] -> [a] Pega os primeiros n elementos de uma lista
fst :: (a,b) -> a Pega no primeiro elemento do par
snd :: (a,b) -> b Pega no segundo elemento do par
id :: a -> a Função de identidade (id x = x)
reverse :: [a] -> [a] Inverte a ordem dos elementos de uma lista
zip :: [a] -> [b] -> [(a,b)] Pega 2 listas e justa-as em uma correspondendo em pares : zip [1, 2] ['a', 'b'] = [(1, 'a'), (2, 'b')]