Código capaz de operar sobre tipos diferentes
Grau de Polimorfismo do Sistema de Tipos
→ Reutilização de Código
Existem vários tipos de polimorfismo
- Coerção
- Sobrecarga
- Paramétrico
- Inclusão
Sistema de Tipos
Verificação de Tipos
- Garante a compatibilidade entre operandos e operadores
- Pode ser estática ou dinâmica
Tipos Compatíveis
- Adequados para a operação de um determinado operador
- Operandos são convertidos implicitamente
Inferência de Tipos
Verificação de tipo feita na compilação
Vantagens
- Geração de código mais confiável
- Depuração simplificada
- Maior legibilidade
Desvantagens
- Menor redigibilidade
- Menor reuso de código
Verificação de tipo feita na execução
Vantagens
- Flexibilidade
- Redigibilidade
- Reuso de código
(defun segundo (l) (car (cdr l))) (segundo (1 2 3)) (segundo ("abacate" "pessego" "banana"))
Desvantagens
- Menor eficiência
- Redução de legibilidade
- Maior consumo de memória
Monomórfico
- Elementos da linguagem devem ter tipos específicos
- Mais simplicidade
- Nenhum reuso de código
- Exemplos: Pascal e Modula-2
Polimórfico
- Algoritmos que atuam sobre vários tipos diversos
- Tipos de Dados e Subprogramas polimórficos
- Exemplos: Ada, ML, C++, Java, Objective-C, …
Possibilidade de criar código sobre tipos distintos
Propriedade de um sistema de tipos
- Permite escrever abstrações uniformes sobre tipos diversos
Sistema de Tipos Polimórfico
→ Elementos da linguagem podem assumir vários tipos
Adhoc – somente sobre abstrações de controle
Universal – sobre abstrações de dados e de controle