Porque polimosfismo de Sobrecarga
Em contraste com o polimorfismo paramétrico, originalmente
definido em ML e atualmente amplamente reconhecido como recurso
importante e vantajoso de uma linguagem de programação,
a importância do polimorfismo de sobrecarga (ou polimorfismo ad
hoc, como é mais usualmente conhecido) é ainda bastante
subestimada. Por exemplo, David Watt, em seu livro sobre conceitos de
linguagens de programação, bastante conhecido e
não muito antigo, considera que o recurso de permitir o uso de
nomes sobrecaregados não aumenta o poder de expressão de
uma linguagem de forma significativa, argumentando que o uso de nomes
sobrecarregados pode ser facilmente substituído, por meio de uma
simples mudança desses nomes. Entretanto, a importância
de permitir a sobrecarga de nomes não reside em uma mera
conveniência para evitar que se tenha que escolher e usar nomes novos
para cada definição, ou para evitar conflitos entre
nomes existentes em um determinado escopo e, assim, evitar a
"poluição" do espaço de nomes usados em
programas. A sobrecarga de nomes tem, outrossim, a propriedade
fundamental de permitir que expressões e nomes definidos por
meio do uso de símbolos sobrecarregados possam ser usados em
contextos que requerem valores de tipos distintos, permitindo assim
que sejam definidas novas abstrações
polimórficas. Como um exemplo bastante simples, considere que o
símbolo + é sobrecarregado para adição de
inteiros e números de ponto flutuante. Nesse caso, podemos ter uma
única definição para computar a soma dos inteiros em uma
lista, seja ela uma lista de inteiros ou uma lista de números de ponto
flutuante. Em outras palavras, podemos fazer uma única
definição, polimórfica, da mesma forma como
ocorre no caso, tão justamente louvado, do polimorfismo
paramétrico.
Além disso, podemos ter e aqui entramos em objetivo
específico desse projeto, uma única definição
para computar a soma dos elementos de qualquer estrutura de dados,
para a qual existe um símbolo sobrecarregado fold (definido de
forma a implementar um catamorfismo sobre a estrutura de
dados). Resumida e bastante informalmente, um catamorfismo sobre uma
estrutura de dados (operação comum de teoria das
categorias) aplica uma operação (binária) sobre
cada um dos elementos dessa estrutura de dados, compondo resultados da
operação anterior com o valor do próximo
elemento. Por exemplo, podemos definir a soma dos elementos de uma
lista como fold (+) 0. Essa definição pode ser feita em
linguagens como ML e Haskell, mas apenas para uma única estrutura de
dados (tipicamente uma lista), e não para somar os elementos de
qualquer estrutura de dados para a qual exista uma
definição de fold apropriada.
Carlos Camarao de Figueiredo
Last modified: Mon Jul 19 20:50:34 BRT 2004