scala - leibniz - monadas filosofia
¿Por qué Scala no tiene una Mónada IO? (1)
Me pregunto por qué Scala no tiene una Mónada IO como Haskell.
Entonces, 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 una pregunta similar sobre este tema, pero su respuesta no es satisfactoria:
Usar IO ciertamente 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?
Porque Scala no es puro (y no tiene medios para imponer que una función es 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 perezoso, por lo que no hay problemas con el orden de ejecución como en Haskell (por ejemplo, no hay necesidad de >>
o seq
). En estas circunstancias, la introducción de la 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, por ejemplo, http://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/
[Editar]
¿Por qué no se hizo como un lenguaje vago y puro?
Esto hubiera sido perfectamente posible (p. Ej., Mirar a 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 vago y puro es algo totalmente genial, pero simplemente demasiado ajeno a 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 la programación funcional y mixta de OO, pero sin imponerlo (lo que habría ahuyentado a casi todos los programadores de Java). De hecho, no tiene sentido tener otro lenguaje completamente funcional: hay Haskell, Erlang, F # (y otros ML) y Clojure (y otros Esquemas / Lisps), que son todos muy sofisticados, estables y exitosos, y no lo harán. Ser reemplazado fácilmente por un recién llegado.