Perché Scala non è puro (e non ha mezzi per far rispettare che una funzione è pura, come D ha) e consente effetti collaterali. Interagisce strettamente con Java (ad esempio riutilizza grandi parti delle librerie Java). Scala non è pigro, quindi non vi è alcun problema per quanto riguarda l'ordine di esecuzione come in Haskell (ad esempio non c'è bisogno di >>
o seq
). In queste circostanze l'introduzione della Monade IO renderebbe la vita più difficile senza guadagnare molto.
Ma se davvero ci sono applicazioni in cui la monade IO ha vantaggi significativi, niente ti impedisce di scrivere la tua implementazione o di usare scalaz. Vedi per es. http://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/
[Edit]
Perché non è stato fatto come un linguaggio pigro e puro?
Questo sarebbe stato perfettamente possibile (ad esempio, guardare Frege, un linguaggio JVM molto simile a Haskell). Ovviamente ciò renderebbe l'interoperabilità Java più complicata, ma non penso che questo sia il motivo principale. Penso che un linguaggio pigro e puro sia una cosa totalmente interessante, ma semplicemente troppo estraneo alla maggior parte dei programmatori Java, che sono il pubblico di riferimento di Scala. Scala è stato progettato per collaborare con il modello a oggetti Java (che è l'esatto opposto di puro e pigro), che consente la programmazione OO funzionale e mista, ma non che applica (che avrebbe eliminato quasi tutti i programmatori Java). In effetti non ha senso avere un altro linguaggio completamente funzionale: Haskell, Erlang, F # (e altre ML) e Clojure (e altri Schemi/Lisps), che sono tutti molto sofisticati, stabili e di successo, e non lo faranno essere facilmente sostituito da un nuovo arrivato.
'getLine' non ha" tipo di ritorno stringa IO ". Il tipo di 'getLine' * è *' IO String'. Non c'è '->', quindi non è una funzione – newacct
@newacct O è una "funzione nulla". In entrambi i casi è un modo valido per pensarci. – Ben
@Ben non ci sono cose come "funzioni nullarie" in Haskell. – ivanm