Quantificação limitada
Na teoria dos tipos , quantificação limitada (também polimorfismo limitado ou genericidade restrita ) refere-se a quantificadores universais ou existenciais que são restritos ("limitados") para abranger apenas os subtipos de um tipo específico. A quantificação limitada é uma interação de polimorfismo paramétrico com subtipificação . A quantificação limitada tem sido tradicionalmente estudada no cenário funcional do Sistema F <:, mas está disponível em linguagens modernas orientadas a objetos que suportam polimorfismo paramétrico ( genéricos ), como Java , C# e Scala .
Visão geral
O propósito da quantificação limitada é permitir que funções polimórficas dependam de algum comportamento específico de objetos em vez de herança de tipo . Ela assume um modelo baseado em registro para classes de objetos, onde cada membro de classe é um elemento de registro e todos os membros de classe são funções nomeadas. Atributos de objeto são representados como funções que não aceitam argumentos e retornam um objeto. O comportamento específico é então algum nome de função junto com os tipos dos argumentos e o tipo de retorno. A quantificação limitada considera todos os objetos com tal função. Um exemplo seria uma min
função polimórfica que considera todos os objetos que são comparáveis entre si. [ citação necessária ]
Quantificação limitada por F
F -quantificação limitada ou quantificação recursivamente limitada , introduzida em 1989, permite uma tipagem mais precisa de funções que são aplicadas em tipos recursivos. Um tipo recursivo é aquele que inclui uma função que o usa como um tipo para algum argumento ou seu valor de retorno. [1]
Exemplo
Esse tipo de restrição de tipo pode ser expressa em Java com uma interface genérica. O exemplo a seguir demonstra como descrever tipos que podem ser comparados entre si e usar isso como informações de digitação em funções polimórficas . A Test.min
função usa quantificação limitada simples e não garante que os objetos sejam mutuamente comparáveis, em contraste com a Test.fMin
função que usa quantificação limitada F.
Em notação matemática, os tipos das duas funções são
- min: ∀ T, ∀ S ⊆ {compararPara: T → int}. S → S → S
- fMin: ∀ T ⊆ Comparável[T]. T → T → T
onde
- Comparável[T] = {compararPara: T → int}
interface Comparável < T > {
int compareTo ( T outro );
}
classe pública Inteiro implementa Comparável < Inteiro > {
@Override
public int compareTo ( Inteiro outro ) { // ... } }
classe pública String implementa Comparável < String > {
@Override
public int compareTo ( String outro ) { // ... }
}
classe pública Teste { public static void main ( String [] args ) { final String a = min ( "gato" , "cachorro" ); final Integer b = min ( 10 , 3 ); final Comparável c = min ( "gato" , 3 ); // Lança ClassCastException em tempo de execução final String str = fMin ( "gato" , "cachorro" ); final Integer i = fMin ( 10 , 3 ); // final Object o = fMin("gato", 3); // Não compila } public static < S extends Comparable > S min ( S a , S b ) { if ( a . compareTo ( b ) <= 0 ) { return a ; } else { return b ; } } public static < T extends Comparable < T >> T fMin ( T a , T b ) { if ( a . compareTo ( b ) <= 0 ) { return a ; } senão { retornar b ; } }
}
Veja também
- Covariância e contravariância (ciência da computação)
- Padrão de modelo curiosamente recorrente
- Curinga (Java)
Notas
Referências
- Cardelli, Luca ; Wegner, Peter (dezembro de 1985). "Sobre a compreensão de tipos, abstração de dados e polimorfismo" (PDF) . Pesquisas de computação da ACM . 17 (4): 471–523. CiteSeerX 10.1.1.117.695 . doi :10.1145/6041.6042. ISSN 0360-0300. S2CID 2921816.
- Peter S. Canning, William R. Cook , Walter L. Hill, John C. Mitchell e William Olthoff. "Polimorfismo F-limitado para programação orientada a objetos". Em Conference on Functional Programming Languages and Computer Architecture , 1989.
- Benjamin C. Pierce "Tipos de interseção e polimorfismo limitado". Notas de aula em Ciência da Computação 664 , 1993.
- Gilad Bracha , Martin Odersky , David Stoutamire e Philip Wadler . "Tornando o futuro seguro para o passado: Adicionando genericidade à linguagem de programação Java". Em Programação Orientada a Objetos: Sistemas, Linguagens, Aplicações (OOPSLA). ACM, outubro de 1998.
- Andrew Kennedy e Don Syme . "Design e Implementação de Genéricos para o .NET Common Language Runtime". Em Programming Language Design and Implementation , 2001.
- Pierce, Benjamin C. (2002). Tipos e Linguagens de Programação . MIT Press. ISBN 978-0-262-16209-8.Capítulo 26: Quantificação limitada
Links externos
- Polimorfismo limitado no repositório de padrões de Portland
- "Polimorfismo F-limitado" em The Cecil Language: Especificação e Justificativa