Eu vim recentemente a perceber que um número de problemas que eu tinha há alguns anos tentando implementar várias teorias matemáticas em Java desceu para o fato de que o sistema de digitação em Java não é suficientemente forte para modelar toda a teoria tipo dependente Martin-Löf .
Antes de Java 5 e genéricos, o único tipo de teoria, você poderia fazer era através de classes e interfaces, que lhe dão tipos arbitrários construídas a partir dos tipos de solo int
, double
, char
e assim por diante usando tipos de produtos e de função. Você também pode criar tipos recursivos como List
s, embora não de maneira uniforme.
Usando genéricos, você pode fazer um pouco mais. Agora você pode definir List<T>
como uma função
para obtermos tipos de pedidos mais altos.
Este não é o fim da história, no entanto. Usando um truque genérico, podemos modelar alguns tipos de produtos dependentes. Por exemplo, podemos definir tipos do formulário usando a sintaxe
public interface f<T extends f<T>>
{
// We can now refer to T as much as we like
// inside the class. T has type f<T>.
}
Como exemplo, podemos modelar a estrutura subjacente básica de um monóide (mas não as condições de associatividade e unitalidade) usando um termo do tipo ( isto é, um conjunto com um elemento de unidade designado e uma operação binária em ). Usando genéricos Java, podemos modelar este tipo:
public interface MonoidElement<T extends MonoidElement<T>>
{
public T unit();
public T mul(T op1, T op2);
}
No entanto, quando tentamos modelar conceitos mais complicados, a teoria dos tipos se decompõe.
Existe uma descrição simples do fragmento do MLTT correspondente aos tipos que podem ser criados no sistema de digitação Java?