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.
'getLine' no tiene" tipo de retorno Cadena IO ". El tipo de 'getLine' * es *' IO String'. No hay '->', entonces no es una función – newacct
@newacct O es una "función nullary". De cualquier manera es una forma válida de pensar sobre eso. – Ben
@Ben no hay cosas tales como "funciones nulary" en Haskell. – ivanm