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 : Int
e 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 a
no 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!