Inferência de tipo baseada em restrições com dados algébricos

11

Eu estou trabalhando em uma linguagem baseada em expressão da genealogia ML, então ela naturalmente precisa de inferência de tipo> :)

Agora, estou tentando estender uma solução baseada em restrições para o problema de inferir tipos, com base em uma implementação simples no EOPL (Friedman e Wand), mas eles datilografam elegantemente tipos de dados algébricos.

O que tenho até agora funciona sem problemas; se uma expressão eé a + b, e : Int, a : Inte b : Int. Se eé uma correspondência,

match n with
  | 0 -> 1
  | n' -> n' * fac(n - 1)`, 

I pode justamente inferir que o t(e) = t(the whole match expression), t(n) = t(0) = t(n'), t(match) = t(1) = t(n' * fac(n - 1)e assim por diante ...

Mas não tenho muita certeza quando se trata de tipos de dados algébricos. Suponha uma função como filtro:

let filter pred list =
  match list with
    | Empty -> Empty
    | Cons(e, ls') when pred e -> Cons (e, filter ls')
    | Cons(_, ls') -> filter 

Para que o tipo de lista permaneça polimórfico, os Contras precisam ser do tipo a * a list -> a list. Assim, ao estabelecer essas restrições, eu, obviamente, precisa olhar para cima estes tipos dos meus construtores algébricas - o problema agora tenho é o 'contexto-sensibilidade' dos usos múltiplos dos construtores algébricas - como posso expressar em meus equações de restrição que o ano cada caso precisa ser o mesmo?

Estou tendo problemas para encontrar uma solução geral para isso e não consigo encontrar muita literatura sobre isso. Sempre que encontro algo semelhante - linguagem baseada em expressões com inferência de tipo baseada em restrições - eles param um pouco antes dos tipos de dados algébricos e do polimorfismo.

Qualquer entrada é muito apreciada!

Kris
fonte
@ Buy Eu não pretendo parecer ingrato, mas não estou procurando uma solução pronta para uso - você tem alguma sugestão? A maioria dos documentos existentes que pude encontrar (como os documentos do INRIA sobre ML, OCaml ...) são muito mais extensos do que o que eu preciso (e sou capaz de entender).
Kris
Eu começaria com o capítulo de inferência da ATTAPL , acho que eles discutem tudo o que você precisa em um nível acessível.
Gilles 'SO- stop be evil'
@Gilles, acho que o ATTAPL é o único livro de PL 'clássico' que não tenho na minha estante: P Mas obrigado, vou dar uma olhada na segunda-feira, me sento no chão da Uni com talvez 10 cópias distribuídas pelos escritórios: )
Kris
@Kris, você já encontrou um recurso acessível para resolver esse problema? Minha implementação de um "mini ML" está travada exatamente nesse problema ... Acho que encontrei o capítulo relevante da ATTAPL ( pauillac.inria.fr/~fpottier/publis/emlti-final.pdf ) e passei os olhos pela seção algébrica tipos de dados, mas receio que esteja um pouco acima da minha cabeça.
Michiakig
@spacemanaki Sim, desde então considero o pdfs.semanticscholar.org/8983/… um excelente recurso para exatamente isso.
Kris

Respostas:

2

Consulte: Mini ML Especificamente na seção Inferência de tipo.

Ele contém código de exemplo em F # para um analisador completo de uma linguagem funcional simples. Mais importante, a seção Inferência de Tipo implementa o algoritmo Hindley-Milner, que é o encontrado na maioria dos sistemas de inferência de tipo. O autor também fornece links para dois outros documentos importantes para ajudar no entendimento da Hindley-Milner; um sendo uma espécie de introdução de alto nível e o outro um artigo que descreve a implementação do algoritmo no código.

Guy Coder
fonte
Links únicos geralmente não são uma resposta. Elabore o que pode ser encontrado lá e por que isso ajuda.
Raphael