Pregunta

He leído que el sistema de tipos de Scala está debilitado por la interoperabilidad de Java y por lo tanto no puede realizar algunas de las mismas facultades que el sistema de tipos de Haskell. ¿Es esto cierto? Es la debilidad a causa de tipo borrado, o estoy mal en todos los sentidos? Es esta diferencia la razón de que no hay clases de tipos Scala tiene?

¿Fue útil?

Solución

La gran diferencia es que no tiene Scala Hindley-Milner tipo global de inferencia y en su lugar utiliza una forma de inferencia de tipos locales, requiere que se especifiquen los tipos de los parámetros del método y el tipo de cambio de funciones sobrecargadas o recursivas.

Esto no es impulsado por tipo de borrado o por otros requisitos de la JVM. Todas las posibles dificultades que aquí se pueden superar, y han sido, basta con considerar Jaskell - http: //docs.codehaus .org / pantalla / JASKELL / Inicio

H-M inferencia no funciona en un contexto orientado a objetos. Específicamente, cuando se utiliza el tipo-polimorfismo (en contraposición a la polimorfismo ad-hoc de clases de tipo). Esto es crucial para una fuerte interoperabilidad con otras bibliotecas de Java, y (en menor medida) para obtener la mejor optimización posible de la JVM.

En realidad no es válido afirmar que, o bien Haskell o Scala tiene un sistema de tipo más fuerte, sólo que son diferentes. Los dos idiomas están empujando los límites para la programación basada en el tipo en diferentes direcciones, y cada idioma tiene ventajas únicas que son difíciles de duplicar en el otro.

Otros consejos

sistema de tipos de Scala es diferente de Haskell, aunque los conceptos de Scala a veces se inspiran directamente en los puntos fuertes de Haskell y su conocimiento de la comunidad de investigadores y profesionales.

Por supuesto, que se ejecuta en una máquina virtual que no se destinen para la programación funcional en primer lugar crea algunos problemas de compatibilidad con los lenguajes existentes dirigidas a esta plataforma. Debido a que la mayor parte del razonamiento acerca de los tipos sucede en tiempo de compilación, las limitaciones de Java (como lengua y como una plataforma) en tiempo de ejecución no son nada para estar preocupado por (excepto Tipo Erasure, aunque precisamente este error parece hacer que la integración en el Java ecosistema más transparente).

Por lo que yo sé el único "compromiso" en el nivel de sistema de tipos con Java es una sintaxis especial para manejar tipos de primas. Mientras Scala ni siquiera permite Tipos primas más, se acepta más viejos archivos de clase Java con ese error. Código Tal vez usted ha visto como List[_] (o el equivalente List[T] forSome { type T } más largo). Esta es una característica de compatibilidad con Java, pero se trata como un tipo existencial también internamente y no debilita el sistema de tipos.

sistema de tipos de Scala hace de soporte , aunque en una más prolija manera que Haskell. Sugiero la lectura de este documento, lo que podría crear una impresión diferente de la fuerza relativa del sistema de tipos de Scala (la tabla en la página 17 sirve como una buena lista de conceptos de sistemas muy potentes tipo).

No necesariamente se relaciona con el poder del sistema de tipos es el enfoque de los compiladores de Haskell Scala y utilizan para inferir los tipos, aunque tiene cierto impacto en la forma de escribir código. Tener un potente algoritmo de inferencia de tipos puede que valga la pena escribir código más abstracto (usted puede decidir si eso es una cosa buena en todos los casos).

En el final del sistema de tipos de Haskell Scala y son impulsados ??por el deseo de proporcionar a sus usuarios con las mejores herramientas para resolver sus problemas, pero han tomado diferentes caminos hacia ese objetivo.

Otro punto interesante a considerar es que Scala apoya directamente el estilo OO clásica. Lo que significa, hay subtipo las relaciones (por ejemplo, la lista es una subclase de la Sec). Y esto hace que la inferencia de tipos más complicado. Añadir a esto el hecho de que se pueden mezclar en los rasgos en Scala, lo que significa que un tipo determinado puede tener múltiples relaciones supertipo (por lo que es aún más complicado)

Scala no tiene rango-n tipos , aunque puede ser posible < a href = "http://apocalisp.wordpress.com/2010/07/02/higher-rank-polymorphism-in-scala/" rel = "noreferrer"> el trabajo en torno a este limitación en ciertos casos.

Sólo tengo poco experenice con Haskell, pero lo más que nota algo obvio que Scala sistema de tipos diferentes de Haskell es la inferencia de tipos.

En Scala, no hay ningún tipo de inferencia global, debe decirle explícita el tipo de argumentos de la función.

Por ejemplo, en la Scala tiene que escribir esto:

def add (x: Int, y: Int) = x + y

en lugar de

add x y = x + y

Esto puede causar problemas cuando se necesita versión genérica de la función de complemento que el trabajo con todo tipo de tipo tiene el método de "+". Hay una solución para esto, pero conseguirá más prolija.

Sin embargo, en el uso real, encontré sistema de tipos de Scala es lo suficientemente potente como para el uso diario, y casi nunca uso los de solución genérica, tal vez esto es porque vengo de mundo Java.

Y la limitación de declare explícitamente el tipo de argumentos no es necesario una mala cosa, es necesario documentar todas formas.

Bien se que Turing reducible?

Ver Oleg Kiselyov de la página http://okmij.org/ftp/ ... Se puede implementar el cálculo lambda en el sistema de tipos de Haskell. Si Scala puede hacer eso, entonces en un sentido sistema de tipos de Haskell y sistema de tipos de Scala computan los mismos tipos. Las preguntas son: ¿Cómo natural es uno sobre el otro? Qué elegante es uno sobre el otro?

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