Pesquisa sobre inferência de tipo baseada em site de chamada?

9

Estou tentando aprender mais sobre a verificação de tipo de programa inteiro e sistemas de inferências de tipo que usam informações de sites de chamada de função para calcular informações de tipo (além da abordagem padrão do uso do corpo da função). Por exemplo, esse algoritmo pode usar uma chamada de função como foo(1)para inferir que a função fooaceita argumentos inteiros. Obviamente, isso complicaria bastante a inferência e tornaria a verificação não modular.

De qualquer forma, não tive muita sorte em encontrar nenhuma pesquisa sobre essa abordagem, provavelmente porque não conheço a terminologia correta para descrever o que estou falando. Alguma dica?

Derek Thurn
fonte
O que você está descrevendo tem dicas de inferência de tipo bidirecional, a menos que eu esteja enganado. Descrever o que você está tentando fazer pode esclarecer, no entanto.
Dominic Mulligan
Você está perguntando porque procura uma maneira de especializar funções polimórficas?
Nponeccop
Na verdade, estou apenas tentando aprender mais sobre sistemas de tipos e, sim, estava pensando principalmente sobre como lidar com funções polimórficas (e chamadas de método em linguagens OO, a mesma coisa). Estou tentando identificar os termos certos para que eu possa ler sobre isso.
Drek Thurn

Respostas:

11

Quase todos os sistemas com inferência de tipo usam informações do site de chamada para fazer isso. Os exemplos incluem ML padrão, OCaml, F # e Haskell. Muitas outras linguagens usam informações do site de chamada para inferir a instanciação de parâmetro de tipo, como Java, C #, Scala e Typed Racket. Isso geralmente é chamado de "Inferência de tipo local".

Eu descreveria apenas o que você está procurando como "Inferência de tipo", e você provavelmente deve começar pesquisando o que é comumente conhecido como o sistema "Hindley-Milner". A página da Wikipedia fornece uma introdução razoável e dicas para os documentos originais.

O ponto de partida para a Inferência de tipo local é o artigo original de Pierce e Turner, melhor lido na versão TOPLAS 2000 ( ACM , PDF ).

Sam Tobin-Hochstadt
fonte
O artigo de Pierce e Turner foi muito esclarecedor, obrigado. Você está ciente de uma implementação mínima do algoritmo que eles descrevem no código? Eu acho que seria muito interessante olhar também, se existir.
Derek Thurn
Não conheço nenhuma implementação mínima. Há um no Typed Racket e outro no Scala, mas ambos implementam algoritmos substancialmente mais complicados.
Sam Tobin-Hochstadt 28/11
0

Você pode dar uma olhada nos sistemas de tipos para tipos de interseção que podem fornecer algo parecido a :: Int -> Int | Bool -> Bool, para que você saiba que duas especializações são Inte Boolsão suficientes, ou use uma inferência de tipo usual para inferir a maioria dos tipos gerais, seguida de uma análise de fluxo de controle para coletar dados reais. argumentos de tipo. De fato, existem abordagens híbridas (CFA expresso como um sistema de tipos e vice-versa).

Pesquisas podem inferir tipos menos gerais em vez dos tipos mais gerais, mas eu não os conheço.

Quanto às técnicas para implementar o polimorfismo, existem duas soluções: 1) especialização (pense em modelos C ++) 2) suposição uniforme de representação (pense em coleções no estilo C com vazio *).

Para 2, você não precisa do tipo do site de chamada durante a digitação e pode oferecer suporte à compilação separada com mais facilidade.

Observe que estamos falando sobre polimorfismo paramétrico aqui, e chamadas de método virtual OO são algo completamente diferente chamado polimorfismo de subtipo. Observe que os modelos C ++ suportam algo como polimorfismo paramétrico e tipagem de pato, que é outra forma de polimorfismo.

nponeccop
fonte
11
"Chamadas de método virtual OO são coisa completamente diferente, chamada polimorfismo ad-hoc" Polimorfismo ad-hoc é outro nome para sobrecarga. Você parece confundi-lo com subtipo de polimorfismo.
Radu GRIGore #
Mas subclasses não são necessariamente subtipos, não são? Por exemplo, para os subtipos, o LSP deve conter.
Nspeccop
11
Verdade, mas fora de questão. "Polimorfismo de subtipo" é o termo padrão. Veja en.wikipedia.org/wiki/Subtype_polymorphism para obter detalhes.
Radu GRIGore 28/11