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 foo
aceita 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?
Respostas:
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 ).
fonte
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ãoInt
eBool
sã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.
fonte