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')]