为什么Scala没有IO M​​onad?

时间:2012-02-18 23:05:59

标签: scala haskell functional-programming

我想知道为什么Scala没有像Haskell那样的IO Monad。

因此,在Scala中,方法readLine的返回类型是String,而在Haskell中,可比函数getLine具有返回类型IO String。

关于这个主题有a similar question,但它的回答并不令人满意:

  

使用IO肯定不是scala中的主导风格。

有人可以解释一下吗?不包括IO Monads到Scala的设计决定是什么?

2 个答案:

答案 0 :(得分:37)

因为Scala不是纯粹的(并且没有办法强制函数是纯粹的,就像D一样)并且允许副作用。它与Java紧密互操作(例如,重用Java库的大部分)。 Scala不是懒惰的,因此在Haskell中执行顺序没有问题(例如,不需要>>seq)。在这种情况下,引入IO Monad会让生活变得更加艰难。

但是如果你确实拥有IO monad具有显着优势的应用程序,那么没有什么能阻止你编写自己的实现或使用scalaz。参见例如http://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/

<强> [编辑]

  

为什么它不是一种懒惰而纯粹的语言?

这是完全可能的(例如,查看Frege,一种非常类似于Haskell的JVM语言)。当然这会使Java的互操作性更加复杂,但我不认为这是主要原因。我认为懒惰和纯粹的语言是一件非常酷的事情,但对大多数Java程序员来说太过陌生,他们是Scala的目标受众。 Scala旨在与Java的对象模型(纯粹和懒惰的完全相反)进行合作,允许功能和混合功能OO编程,但不是强制执行它(会赶走所有Java程序员)。事实上,拥有另一种功能完备的语言是没有意义的:有Haskell,Erlang,F#(以及其他ML)和Clojure(以及其他Schemes / Lisps),它们都非常复杂,稳定且成功,并且不会很容易被新人取代。

答案 1 :(得分:1)

有关如何在Scala中实现IO monad的完整介绍,请参见此演示文稿(下载以获得最佳质量):

https://www.slideshare.net/pjschwarz/game-of-life-polyglot-fp-haskell-scala-unison-part-1 https://www.slideshare.net/pjschwarz/game-of-life-polyglot-fp-haskell-scala-unison-part-2

enter image description here enter image description here enter image description here enter image description here