2012-02-18 18 views
24

Mi chiedo perché Scala non abbia un IO Monad come Haskell.Perché Scala non ha una Monade IO?

Quindi, in Scala il tipo di ritorno del metodo readLine è String mentre in Haskell la funzione comparabile getLine ha il tipo di ritorno IO String.

C'è a similar question su questo argomento, ma la sua risposta non soddisfacente:

Utilizzo IO non è certamente lo stile dominante a Scala.

Qualcuno può spiegarlo un po 'oltre? Qual è stata la decisione di progettazione per non aver incluso IO Monads su Scala?

+9

'getLine' non ha" tipo di ritorno stringa IO ". Il tipo di 'getLine' * è *' IO String'. Non c'è '->', quindi non è una funzione – newacct

+5

@newacct O è una "funzione nulla". In entrambi i casi è un modo valido per pensarci. – Ben

+4

@Ben non ci sono cose come "funzioni nullarie" in Haskell. – ivanm

risposta

36

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.

+0

Quindi la ragione principale è l'interoperabilità Java? O perché non è stato fatto come un linguaggio pigro e puro? – sschaef

+3

@Antoras, la JVM e il suo byte-code non hanno il supporto integrato per la pigrizia e la purezza. Ciò significa che ogni chiamata a metodi non Scala dovrebbe avvenire nella monade IO e utilizzare parametri severi, il che renderebbe l'interoperabilità Java * molto * difficile. – dflemstr

+4

F # è in realtà più simile a scala - non è impuro e pigro solo esplicitamente (ma non ho alcuna esperienza con F #, potrei sbagliarmi) –

Problemi correlati