utiliza - Desventajas del sistema de tipo Scala versus Haskell?
scala lenguaje de programacion ventajas y desventajas (6)
He leído que el sistema de tipos de Scala se ve debilitado por la interoperabilidad de Java y, por lo tanto, no puede realizar algunos de los mismos poderes que el sistema de tipos de Haskell. ¿Es esto cierto? ¿Es la debilidad debido al borrado de tipo, o estoy equivocado en todos los sentidos? ¿Es esta diferencia la razón por la que Scala no tiene clases de tipos?
Bueno, ¿son Turing reducibles?
Vea la página de Oleg Kiselyov http://okmij.org/ftp/ ... Uno puede implementar el cálculo lambda en el sistema de tipos de Haskell. Si Scala puede hacer eso, entonces, en cierto sentido, el sistema de tipos de Haskell y el sistema de tipos de Scala calculan los mismos tipos. Las preguntas son: ¿Qué tan natural es uno sobre el otro? ¿Qué tan elegante es uno sobre el otro?
El sistema de tipos de Scala es diferente al de Haskell, aunque los conceptos de Scala a veces se inspiran directamente en las fortalezas de Haskell y su comunidad informada de investigadores y profesionales.
Por supuesto, la ejecución en una VM no destinada principalmente a la programación funcional en primer lugar crea algunas preocupaciones de compatibilidad con los lenguajes existentes que apuntan a esta plataforma. Debido a que la mayor parte del razonamiento sobre los tipos ocurre en tiempo de compilación, las limitaciones de Java (como lenguaje y como plataforma) en tiempo de ejecución no son motivo de preocupación (excepto Type Erasure, aunque este error parece hacer la integración en Java ecosistema más transparente).
Por lo que yo sé, el único "compromiso" en el nivel del sistema de tipos con Java es una sintaxis especial para manejar los tipos sin procesar. Si bien Scala ni siquiera permite los tipos crudos, acepta archivos de clase Java más antiguos con ese error. Tal vez haya visto código como List[_]
(o la List[T] forSome { type T }
más larga equivalente List[T] forSome { type T }
). Esta es una característica de compatibilidad con Java, pero también se trata como un tipo existencial internamente y no debilita el sistema de tipos.
El sistema de tipos de Scala admite clases de tipo , aunque de una manera más detallada que Haskell. Sugiero leer este artículo, que podría crear una impresión diferente sobre la fortaleza relativa del sistema de tipos de Scala (la tabla de la página 17 sirve como una buena lista de conceptos de sistemas de tipo muy potentes).
No necesariamente relacionado con el poder del sistema de tipo es el enfoque que utilizan los compiladores de Scala y Haskell para inferir tipos, aunque tiene cierto impacto en la forma en que las personas escriben el código. Tener un poderoso algoritmo de inferencia de tipo puede hacer que valga la pena escribir un código más abstracto (usted puede decidir si eso es bueno en todos los casos).
Al final, el sistema de tipos de Scala y Haskell está impulsado por el deseo de proporcionar a sus usuarios las mejores herramientas para resolver sus problemas, pero han tomado diferentes caminos para alcanzar ese objetivo.
La gran diferencia es que Scala no tiene inferencia de tipo global de Hindley-Milner y en su lugar utiliza una forma de inferencia de tipo local, que le exige que especifique los tipos para los parámetros del método y el tipo de retorno para las funciones sobrecargadas o recursivas.
Esto no está dirigido por borrado de tipo u otros requisitos de la JVM. Todas las posibles dificultades aquí se pueden superar, y han sido, simplemente considere Jaskell - http://docs.codehaus.org/display/JASKELL/Home
La inferencia de HM no funciona en un contexto orientado a objetos. Específicamente, cuando se utiliza el polimorfismo de tipo (en oposición al polimorfismo ad-hoc de las clases de tipo). Esto es crucial para una fuerte interoperabilidad con otras bibliotecas Java, y (en menor medida) para obtener la mejor optimización posible de la JVM.
No es realmente válido decir que Haskell o Scala tienen un sistema de tipo más fuerte, solo que son diferentes. Ambos idiomas están empujando los límites de la programación basada en tipos en diferentes direcciones, y cada idioma tiene fortalezas únicas que son difíciles de duplicar en el otro.
Otro punto interesante a considerar es que Scala apoya directamente el estilo OO clásico. Lo que significa que hay relaciones de subtipo (por ejemplo, List es una subclase de Seq). Y esto hace que la inferencia de tipo sea más complicada. Agregue a esto el hecho de que puede mezclar rasgos en Scala, lo que significa que un tipo determinado puede tener múltiples relaciones de supertipo (lo que lo hace aún más complicado)
Scala no tiene rango-n tipos , aunque puede ser posible evitar esta limitación en ciertos casos.
Solo tengo poca experiencia con Haskell, pero lo más obvio es que el tipo de sistema Scala diferente de Haskell es la inferencia tipográfica.
En Scala, no hay inferencia de tipo global, debe indicar explícitamente el tipo de argumentos de la función.
Por ejemplo, en Scala necesitas escribir esto:
def add (x: Int, y: Int) = x + y
en lugar de
add x y = x + y
Esto puede causar un problema cuando necesite una versión genérica de la función de agregar que funcione con todo tipo de tipo que tenga el método "+". Hay una solución para esto, pero se volverá más detallada.
Pero en el uso real, descubrí que el sistema de tipos de Scala es lo suficientemente potente para el uso diario, y casi nunca uso esas soluciones genéricas, tal vez esto se debe a que vengo del mundo de Java.
Y la limitación de declarar explícitamente el tipo de argumentos no es algo malo, es necesario documentarlo de todos modos.