Dado este código
let x: T0 <- e0 in e1
Tenemos que deducir el tipo del objeto:
Un orden parcial en una jerarquía de tipos es una relación binaria \(\le\) tal que cumple:
if e0 then e1 else e2 fi
Si \(e1\) tiene tipo \(T1\) y \(e2\) tiene tipo \(T2\), ¿qué tipo tiene que devolver esta expresión?
El mínimo común ancestro (least common ancestor) de dos clases \(X,Y\) es la única clase \(Z\) que cumple \(X\le Z\) y \(Y\le Z\) y si otra clase \(W\) cumple \(X\le W\), \(Y\le W\) entonces \(Z\le W\).
Figura 1: Árbol de clases
Cuando tenemos un método, ¿qué tipo tenemos que inferir?
Demostrar que, con el siguiente árbol:
si \(O(x) = c3, O(y) = c1\) y \(M(f,c1)= (c1,c1)\), el tipo de \(x.f(y.f(x))\) es \(c1\).
Se traduce a código a:
typecheck(Environment,e1+e2){ T1 = typecheck(Environment, e1); T2 = typecheck(Environment, e1); Check T1 == T2 == Int; return Int; }
Se traduce a código a:
typecheck(Environment, let x:T <- e0 in e1 ){ T1 = typecheck(Environment, e0); T2 = typecheck(Environment.add(x:T), e1); Check(T0,T1); return T1; }