Recientemente me di cuenta de que una serie de problemas que tuve hace unos años al tratar de implementar varias teorías matemáticas en Java se redujeron al hecho de que el sistema de escritura en Java no es lo suficientemente fuerte como para modelar toda la teoría de tipos dependiente de Martin-Löf .
Antes de Java 5 y los genéricos, el único tipo teoría se podía hacer era a través de clases e interfaces, que le dan tipos arbitrarios construidas a partir de los tipos de suelo int
, double
, char
y así sucesivamente utilizando tipos y funcionamiento del producto. También puede crear tipos recursivos como List
s, aunque no de manera uniforme.
Usando genéricos, puede hacer un poco más. Ahora puede definir List<T>
como una función
y así obtenemos tipos de orden superior.
Sin embargo, este no es el final de la historia. Usando un truco genérico, podemos modelar algunos tipos de productos dependientes. Por ejemplo, podemos definir tipos de la forma usando la sintaxis
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 ejemplo, podemos modelar la estructura básica subyacente de un monoide (pero no las condiciones de asociatividad y unitalidad) usando un término de tipo ( es decir, un conjunto con un elemento de unidad designado y una operación binaria en ). Usando genéricos de Java, podemos modelar este tipo:
public interface MonoidElement<T extends MonoidElement<T>>
{
public T unit();
public T mul(T op1, T op2);
}
Sin embargo, cuando intentamos modelar conceptos más complicados, la teoría de tipos se rompe.
¿Existe una descripción simple del fragmento de MLTT correspondiente a los tipos que se pueden construir en el sistema de escritura Java?