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