Pregunta

¿Cómo explicar el sistema de tipos de Scala a un experto de Haskell? ¿Qué ejemplos muestran las ventajas de Scala?

¿Cómo explicar el sistema de tipos de Haskell a un practicante avanzado de Scala? ¿Qué se puede hacer en Haskell que no se puede hacer en Scala?

¿Fue útil?

Solución

Scala a un programador de Haskell:

Scala es un lenguaje estricto e impuro con módulos de primera clase. Los tipos de datos se declaran como " clases " o "rasgos" con diferencias sutiles, y módulos u "objetos" son valores de esos tipos. Scala admite constructores de tipos que toman parámetros de tipo cuantificados universalmente. Los objetos / clases / rasgos tienen miembros que consisten en valores, variables mutables y funciones (llamadas "métodos", a los que el módulo se pasa implícitamente como una variable llamada this ). Los módulos pueden tener miembros de tipo que también pueden tomar parámetros. Los miembros de tipo se cuantifican existencialmente y los parámetros de tipo pueden ser de tipo superior. Debido a que los tipos pueden ser miembros de valores de primera clase, Scala proporciona un tipo de escritura dependiente llamada tipos dependientes de ruta .

Las funciones de primera clase también son módulos. Una función es un módulo con un método llamado apply . Un método no es de primera clase, pero se proporciona una sintaxis para ajustar un método en una función de primera clase. Desafortunadamente, un módulo requiere todos sus parámetros de tipo por adelantado, por lo tanto, no se permite cuantificar universalmente una función de primera clase parcialmente aplicada. En términos más generales, Scala carece por completo de un mecanismo directo para los tipos de rango superior a 1, pero los módulos parametrizados en tipos de tipo superior pueden explotarse para simular tipos de rango n.

En lugar de clases de tipo con alcance global, Scala le permite declarar un valor implícito de cualquier tipo dado. Esto incluye tipos de funciones, que proporcionan conversión implícita y, por lo tanto, extensión de tipo. Además de las conversiones implícitas, la extensión de tipo es proporcionada por " extend " mecanismo que le permite declarar una relación de subtipo / supertipo entre módulos. Este mecanismo se puede utilizar para simular tipos de datos algebraicos donde el supertipo se puede ver como el tipo en el lado izquierdo de una declaración de datos, y sus subtipos como los constructores de valores en el lado derecho. Scala tiene amplias capacidades de coincidencia de patrones utilizando un emparejador de patrones virtualizado con patrones de primera clase.

Scala admite subtipos, y esto limita considerablemente la inferencia de tipos. Pero la inferencia de tipos ha mejorado con el tiempo. Se admite la inferencia de tipos de tipo superior. Sin embargo, Scala carece de cualquier sistema de tipo significativo y, por lo tanto, no tiene inferencia amable ni unificación amable. Si se introduce una variable de tipo, es del tipo * a menos que se indique lo contrario. Ciertos tipos como Any (el supertipo de todos los tipos) y Nothing (un subtipo de cada tipo) son técnicamente de de todo tipo aunque no pueden ser aplicado a los argumentos de tipo.

Haskell a un programador de Scala:

Haskell es un lenguaje puramente funcional. Esto significa que no se permite que las funciones tengan ningún efecto secundario. Por ejemplo, un programa Haskell no se imprime en la pantalla como tal, sino que es una función que devuelve un valor del tipo de datos IO [_] que describe una secuencia de acciones para que realice el subsistema IO .

Mientras que Scala es estricto por defecto y proporciona " por nombre " Anotación para argumentos de función no estrictos, Haskell es perezoso por defecto usando "por necesidad" semántica, y proporciona anotaciones para argumentos estrictos.

La inferencia de tipos en Haskell es más completa que en Scala, con una inferencia completa. Esto significa que la anotación de tipo casi nunca es necesaria.

Las extensiones recientes del compilador GHC permiten características avanzadas del sistema de tipos que no tienen equivalente en Scala, como los tipos de rango n, las familias de tipos y el polimorfismo de tipos.

En Haskell, un módulo es una colección de tipos y funciones, pero los módulos no son entidades de primera clase. Las clases de tipos proporcionan los implicits, pero estos tienen un alcance global una vez declarados, y no se pueden pasar explícitamente como en Scala. Múltiples instancias de una clase de tipo para un tipo dado se resuelven envolviéndose con un newtype para desambiguar, mientras que en Scala esto se resolvería simplemente mediante el alcance o pasando instancias explícitamente.

Dado que Haskell no está orientado a objetos, no existe una dicotomía método / función. Cada función es de primera clase y todas las funciones se cursan de manera predeterminada (no Function1, Function2, etc.).

Haskell no tiene un mecanismo de subtipo, pero las clases de tipos pueden tener una relación de subclase.

Otros consejos

No creo que nadie haya comparado sistemáticamente Haskell (como lo ejemplifica el sistema de tipos de GHC) con Scalas. Los principales puntos de diferencia son el grado de inferencia de tipos y el soporte para tipos de rango superior. Pero un tratamiento completo de las diferencias sería un resultado publicable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top