No trabalho, fui encarregado de deduzir algumas informações de tipo sobre uma linguagem dinâmica. Reescrevo seqüências de instruções em let
expressões aninhadas , da seguinte maneira:
return x; Z => x
var x; Z => let x = undefined in Z
x = y; Z => let x = y in Z
if x then T else F; Z => if x then { T; Z } else { F; Z }
Como estou começando com informações gerais sobre tipos e tentando deduzir tipos mais específicos, a escolha natural são os tipos de refinamento. Por exemplo, o operador condicional retorna uma união dos tipos de suas ramificações verdadeiras e falsas. Em casos simples, funciona muito bem.
No entanto, encontrei um problema ao tentar inferir o tipo do seguinte:
function g(f) {
var x;
x = f(3);
return f(x);
}
Que é reescrito para:
\f.
let x = undefined in
let x = f 3 in
f x
O HM inferiria e, consequentemente, . O tipo real que eu quero poder deduzir é:
Eu já estou usando dependências funcionais para resolver o tipo de +
operador sobrecarregado , então achei que era uma escolha natural usá-las para resolver o tipo de f
dentro g
. Ou seja, os tipos de f
em todas as suas aplicações juntos determinam exclusivamente o tipo de g
. Entretanto, os fundeps não se prestam muito bem a números variáveis de tipos de fontes.
De qualquer forma, a interação do polimorfismo e da digitação de refinamento é problemática. Então, há uma abordagem melhor que estou perdendo? Atualmente, estou digerindo "Tipos de refinamento para ML" e gostaria de receber mais literatura ou outras dicas.
fonte