5.6 Polimorfismo Paramétrico

O polimorfismo paramétrico nos permite definir funções que recebem como parâmetro elementos pertencentes a uma determinada família de tipos . Através desse recurso, podemos definir funções mais genéricas e expressivas, mantendo a segurança da tipagem estática. Tais funções são chamadas de funções genéricas e junto com tipos de dados genéricos, formam a base da programação genérica.

Utilizando polimorfismo paramétrico, podemos definir uma função length que retorna o tamanho de uma lista, seja essa lista uma lista de caracteres, números, ou qualquer outro tipo de dado.

Exemplo 48:

length [] = 0

length (x:xs) = 1 + length xs

Por exemplo, quando criamos a função sum, definimos que ela receberá uma lista de números e retornará a soma destes, contudo, note que não falamos se a lista é de números naturais, inteiros, reais, etc. Ou seja, a função sum, foi definida de forma genérica para somar vários tipos de número.

Exemplo 49:

sum [] = 0

sum (x:xs) = x + sum xs

Outro exemplo é a função map, no Exemplo 50, que recebe como parâmetro uma função f e uma lista l, e retorna uma nova lista, gerada pela aplicação de f para cada elemento da lista l. Note que não falamos o tipo da função f (i.e., não informamos o tipo do parâmetro que f recebe, nem o tipo do retorno) bem como não falamos o tipo da lista (i.e., não falamos se será uma lista de números, de caracteres, de strings, etc.).

Exemplo 50:

map f [] = []

map f (x:xs) = f x : map f xs

Perceba, contudo, que o que é realizado com o parâmetro recebido pela função polimórfica determina quais tipos de dados podem ser passados à função. No caso da função length, não é realizada nenhuma expressão com nenhum elemento da lista, logo o tipo da lista não importa, então essa função funciona para qualquer tipo de lista. Já a função sum, aplica o operador/função de soma aos elementos da lista recebida como parâmetro, o que obriga a estes serem “somáveis”. Por fim temos o map, que pode receber qualquer função f e qualquer lista l, desde que a f receba um valor do mesmo tipo dos elementos de l.