2012-02-18 33 views
24

Me pregunto por qué Scala no tiene una Monad de IO como Haskell.¿Por qué Scala no tiene una Monad de IO?

Por lo tanto, en Scala, el tipo de retorno del método readLine es String, mientras que en Haskell la función comparable getLine tiene el tipo de retorno IO String.

Hay a similar question sobre este tema, pero su respuesta no satisfactoria:

Uso de IO no es el estilo dominante en Scala.

¿Alguien puede explicar esto un poco más? ¿Cuál fue la decisión de diseño para no incluir IO Monads to Scala?

+9

'getLine' no tiene" tipo de retorno Cadena IO ". El tipo de 'getLine' * es *' IO String'. No hay '->', entonces no es una función – newacct

+5

@newacct O es una "función nullary". De cualquier manera es una forma válida de pensar sobre eso. – Ben

+4

@Ben no hay cosas tales como "funciones nulary" en Haskell. – ivanm

Respuesta

36

Porque Scala no es puro (y no tiene medios para exigir que una función sea pura, como D tiene) y permite efectos secundarios. Interopera estrechamente con Java (por ejemplo, reutiliza grandes partes de las bibliotecas de Java). Scala no es flojo, por lo que no hay problema con el orden de ejecución, como en Haskell (por ejemplo, no es necesario >> o seq). Bajo estas circunstancias, la introducción de IO Monad haría la vida más difícil sin ganar mucho.

Pero si realmente tiene aplicaciones donde la mónada IO tiene ventajas significativas, nada le impide escribir su propia implementación o usar scalaz. Ver p. http://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/

[Editar]

¿Por qué no era hecho como un lenguaje vago y puro?

Esto hubiera sido perfectamente posible (por ejemplo, mira Frege, un lenguaje JVM muy similar a Haskell). Por supuesto, esto haría que la interoperabilidad de Java sea más complicada, pero no creo que esta sea la razón principal. Creo que un lenguaje perezoso y puro es algo totalmente genial, pero simplemente demasiado extraño para la mayoría de los programadores de Java, que son el público objetivo de Scala. Scala fue diseñado para cooperar con el modelo de objetos de Java (que es exactamente lo contrario de puro y perezoso), permitiendo funcional y mixto funcional-OO programación, pero no aplicando (que habría ahuyentado a casi todos los programadores Java). De hecho, no tiene sentido tener otro lenguaje completamente funcional: Haskell, Erlang, F # (y otros ML) y Clojure (y otros Esquemas/Lisp), que son todos muy sofisticados, estables y exitosos, y no lo harán. ser reemplazado fácilmente por un recién llegado.

+0

¿Entonces la razón principal es la interoperabilidad de Java? ¿O por qué no se hizo como un lenguaje perezoso y puro? – sschaef

+3

@Antoras, la JVM y su código de bytes no tienen soporte integrado para la pereza y la pureza. Esto significa que cada llamada a métodos que no sean de Scala tendría que ocurrir en la mónada de IO y usar parámetros estrictos, lo que haría que la interoperabilidad de Java * fuera muy difícil. – dflemstr

+4

F # es en realidad más parecido a scala - unpure y flojo solo explícitamente (pero no tengo expirience con F #, podría estar equivocado) –

Cuestiones relacionadas