Me doy cuenta de que algunas cosas son más fáciles / difíciles en un idioma que en el otro, pero solo me interesan las características relacionadas con el tipo que son posibles en uno e imposibles / irrelevantes en el otro. Para hacerlo más específico, ignoremos las extensiones de tipo Haskell ya que hay tantas que hacen todo tipo de cosas locas / geniales.
java
haskell
type-systems
static-typing
GlenPeterson
fuente
fuente
Respuestas:
("Java", como se usa aquí, se define como Java SE 7 estándar ; "Haskell", como se usa aquí, se define como Haskell 2010 estándar ).
Cosas que tiene el sistema de tipos de Java pero que Haskell no:
Cosas que tiene el sistema de tipos de Haskell pero que Java no tiene:
EDITAR:
Ejemplos de cada uno de los puntos enumerados anteriormente:
Exclusivo de Java (en comparación con Haskell)
Subtipo nominal de polimorfismo
Información de tipo de tiempo de ejecución parcial
Exclusivo de Haskell (en comparación con Java)
Polimorfismo ad-hoc acotado
Polimorfismo de subtipo "basado en restricciones" (basado en polimorfismo ad-hoc acotado)
Polimorfismo paramétrico de tipo superior
Mecanografía principal
Es difícil dar un ejemplo directo de este, pero significa que cada expresión tiene exactamente un tipo máximo general (llamado su tipo principal ), que se considera el tipo canónico de esa expresión. En términos de polimorfismo de subtipo "basado en restricciones" (ver arriba), el tipo principal de una expresión es el subtipo único de cada tipo posible en el que se puede usar esa expresión. La presencia de tipeo principal en Haskell (no extendido) es lo que permite una inferencia de tipo completa (es decir, una inferencia de tipo exitosa para cada expresión, sin necesidad de anotaciones de tipo). Las extensiones que rompen la tipificación principal (de las cuales hay muchas) también rompen la integridad de la inferencia de tipos.
fuente
l
como variable de una sola letra, ¡es MUY difícil distinguirlo1
!Typeable
, pero Haskell 2010 no lo tiene (¿tal vez Haskell 2014 sí?).El sistema de tipos de Java carece de un polimorfismo de tipo superior; El sistema de tipos de Haskell lo tiene.
En otras palabras: en Java, los constructores de tipos pueden abstraer sobre los tipos, pero no sobre los constructores de tipos, mientras que en Haskell, los constructores de tipos pueden abstraer sobre los constructores de tipos y los tipos.
En inglés: en Java, un genérico no puede tomar otro tipo genérico y parametrizarlo,
mientras que en Haskell esto es bastante fácil
fuente
<T<_> extends Collection> T<Integer> convertStringsToInts(T<string> strings)
. La idea aquí sería que si alguien lo llamara,convertStringsToInts<ArrayList>
tomaría una lista de cadenas y devolvería una lista de enteros. Y si en su lugar lo usaranconvertStringsToInts<LinkedList>
, sería lo mismo con las listas vinculadas.forall
tus tipos. En Haskell, un tipoa -> b
es implícitamenteforall a. forall b. a -> b
. Con una extensión, puede hacer que estosforall
mensajes sean explícitos y moverlos.Para complementar las otras respuestas, el sistema de tipos de Haskell no tiene subtipos , mientras que los lenguajes orientados a objetos mecanografiados como Java.
fuente
Una cosa que nadie ha mencionado hasta ahora es la inferencia de tipos: un compilador de Haskell generalmente puede inferir el tipo de expresiones, pero debe decirle al compilador de Java sus tipos en detalle. Estrictamente, esta es una característica del compilador, pero el diseño del lenguaje y el sistema de tipos determina si la inferencia de tipos es factible. En particular, la inferencia de tipos interactúa mal con el polimorfismo de subtipo de Java y la sobrecarga ad hoc. En contraste, los diseñadores de Haskell se esfuerzan por no introducir características que afecten la inferencia de tipos.
Otra cosa que la gente parece no haber mencionado hasta ahora son los tipos de datos algebraicos. Es decir, la capacidad de construir tipos a partir de sumas ('o') y productos ('y') de otros tipos. Las clases Java hacen productos (campo a y campo b, por ejemplo) bien. Pero en realidad no hacen sumas (campo a o campo b, por ejemplo). Scala tiene que codificar esto como clases de casos múltiples, que no es lo mismo. Y aunque funciona para Scala, es un poco exagerado decir que Java lo tiene.
Haskell también puede construir tipos de funciones utilizando el constructor de funciones, ->. Si bien los métodos de Java tienen firmas de tipo, no puede combinarlos.
El sistema de tipos de Java permite un tipo de modularidad que Haskell no tiene. Pasará un tiempo antes de que haya un OSGi para Haskell.
fuente