Dado el tipo existencial
T = ∃X.{op₁:X, op₂:X→boolean}
y esta interfaz genérica de Java:
interface T<X> {
X op₁();
boolean op₂(X something);
}
¿Cuáles son las diferencias fundamentales entre el tipo existencial y la interfaz Java?
Obviamente hay diferencias sintácticas y la orientación a objetos de Java (que también incluye detalles como this
parámetros ocultos , etc.). No estoy tan interesado en esto como en las diferencias conceptuales y semánticas, aunque si alguien quisiera arrojar luz sobre algunos puntos más finos (como la diferencia de notación entre T
vs. T<X>
), eso también sería apreciado.
java
interfaces
type-systems
stakx
fuente
fuente
Respuestas:
Hmm ... Esa definición se parece mucho a una muestra de haskell que he visto hace mucho tiempo.
Cuando
X
se aplica el constructor ∀ en realidad se convierte en ∃. Tenga en cuenta que cuando sacavalue
no conoce el tipo y tiene un conjunto de operaciones vacío sobre él. Pero dado queviewValue
es un poco coherente convalue
él, se le puede aplicar.Supongo que la principal diferencia de Java
interface
que propuso es el hecho de que debe conocer el tipo intermedio para pasar el resultado deop₁
aop₂
. Es decir, el sistema adecuado para el tipo existencial debe seleccionar el tipo correcto que se garantiza que existe por condición. Es decir, que debe ser capaz de escribir con función de tipo:∀X. X→(X→boolean)→T
. En la muestra anterior, dicha función es unX
constructor utilizadoX 3 show
(show
es una función que toma argumentos de cualquier tipo que implementaShow
y devuelveString
)Actualizado: acabo de volver a leer su pregunta y creo que tengo una construcción adecuada para Java:
Tienes razón al mencionar
this
: en realidad es tu opción.Así que supongo que entendí ahora que los lenguajes clásicos de OOP (Java, C #, C ++, etc.) siempre implementan el tipo existencial con un solo valor
this
y unas funciones sobre él llamadas "métodos" que implícitamente llaman con ese valor :)PD: Lo siento, no estoy muy familiarizado con Java, pero espero que tengas la idea.
fuente
La única diferencia es que la interfaz de Java realmente significa algo para el compilador de Java.
El tipo existencial es la definición formal de un tipo, no específica de cualquier idioma. Los informáticos usan este tipo de definición para probar cosas sobre el tipo y sobre los idiomas que lo implementan. La interfaz de Java es una de las implementaciones de Java del tipo formalmente definido.
fuente
Los 2 tipos presentados son muy diferentes entre sí. La definición de interfaz que ha escrito es de tipo universal (los genéricos de Java en general pertenecen a esta categoría).
Un tipo existencial oculta un tipo dentro de su implementación del consumidor. Intuitivamente, para que X sea existencial en T, la identidad de X no puede ser conocida por ningún consumidor; todo lo que se debe saber es el conjunto de operaciones proporcionadas en la definición. Existe un tipo T para algún tipo X.
Por el contrario, un tipo universal define operaciones aplicables a todos los tipos, de los cuales el consumidor es libre de elegir. El tipo de interfaz T es exactamente eso. X es instanciado por el consumidor, quien sabrá exactamente qué tipo X es. Existe un tipo T para cada tipo X en el universo.
Los existenciales no están realmente presentes en Java como una construcción de lenguaje, excepto en el caso limitado de comodines (
List<?>
). Pero sí, se pueden emular con interfaces. El problema se vuelve más de diseño.Como se señaló anteriormente, en un entorno orientado a objetos, los existenciales se vuelven difíciles de implementar porque la forma en que generalmente codifica la información de tipo de X (lo que puede hacer con él) es tener funciones miembro en un tipo de interfaz que X implementa. En resumen, las interfaces pueden comprar algunas capacidades de abstracción de tipo, pero requieren la eliminación de lo existencial hasta cierto punto.
fuente