haskell type-erasure

¿Haskell borra tipos?



type-erasure (2)

¿Haskell borra los tipos y, de ser así, de qué manera es similar / diferente al borrado de tipo que se produce en Java?


Advertencia: experiencia + inferencia. Consulte a alguien que trabaja en ambos compiladores para The Truth.

En el sentido de que la verificación de tipos se realiza en tiempo de compilación, y varias características complejas del sistema de tipos se reducen a construcciones de lenguaje mucho más simples, sí, pero de una manera bastante diferente a Java.

Una firma de tipo no crea una sobrecarga de tiempo de ejecución. El compilador de Haskell es bueno en la transformación del programa (tiene más margen de maniobra, ya que el orden de ejecución en muchos casos no está especificado por el programador), e incorpora automáticamente las definiciones apropiadas y especializa las funciones haskell-polymorhpic (= java-generic) para un tipo particular etc, como le parezca, si ayuda. Es un borrado de tipo similar a Java, pero más aún.

En esencia, no hay fundiciones de tipo necesarias en Haskell para garantizar la seguridad del tipo, porque Haskell está diseñado para ser seguro desde el principio. No recurrimos a convertir todo en un Objeto, y no los devolvemos, porque una función polimórfica (genérica) realmente funciona en cualquier tipo de datos, sin importar qué, tipos de punteros o enteros sin caja, simplemente funciona. sin engaños Por lo tanto, a diferencia de Java, la conversión no es una característica de compilar código polimórfico (genérico). La gente de Haskell tiende a sentir que, si estás haciendo el casting de tipos, te despediste de la seguridad de todos modos.

Para un buen ejemplo de cómo garantizar que la corrección de tipo estática del código en el momento de la compilación pueda evitar la sobrecarga del tiempo de ejecución, hay un newtype construcción en Haskell que es una envoltura segura para un tipo existente, y está completamente compilada, toda la construcción y destrucción simplemente no sucede en tiempo de ejecución. El sistema de tipos garantiza que, en el momento de la compilación, se utiliza correctamente, no se puede obtener en el tiempo de ejecución, excepto mediante el uso de funciones de acceso (con comprobación de tipo).

Las funciones polimórficas (genéricas) no tienen gastos generales polimórficos. Las funciones sobrecargadas de Haskell (métodos de instancia de interfaz Java) tienen una sobrecarga de datos en el sentido de que hay un diccionario implícito de funciones que se usa para lo que parece ser un enlace tardío a los programadores de Java, pero de hecho, de nuevo, se determina en el momento de la compilación.

Resumen: sí, incluso más que en Java, y no, nunca estuvieron allí en tiempo de ejecución para borrar de todos modos.


C y Pascal tienen borrado de tipo. Java le permite inspeccionar las clases en tiempo de ejecución, ¡incluso las cargadas dinámicamente!

Lo que Haskell hace es mucho más cercano a Pascal que a Java.