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

kir*_*uku 25 haskell functional-programming scala

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

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

关于这个话题有一个类似的问题,但它的答案并不令人满意:

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

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

Lan*_*dei 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),它们都非常复杂,稳定且成功,并且不会很容易被新人取代.

  • F#实际上更像是scala - 仅仅是明确的懒惰和懒惰(但我对F#没有任何考验,我可能是错的) (4认同)
  • @ Antoras,JVM及其字节码没有内置的懒惰和纯度支持.这意味着每次调用非Scala方法都必须在IO monad中进行,并使用严格的参数,这将使Java互操作性*非常困难. (3认同)