为什么Scala有一个IO Monad?
我想知道为什么Scala没有像Haskell这样的IO Monad。
因此,在Scala中,readLine的返回类型为String,而在Haskell中,类似函数getLine具有返回类型IO String。 关于这个话题有a similar question,但它的答案并不令人满意:
有人可以解释一下吗?什么是不包括IO Monads到Scala的设计决策? 解决方法
因为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程序员而言,这是非常不可思议的,而这些Java程序员是Scala的目标读者。 Scala旨在与Java的对象模型(这与纯粹和懒惰的完全相反)进行配合,允许功能和混合的功能OO编程,但不执行它(几乎所有的Java程序员都会追赶)。事实上,还没有一个功能完整的语言:Haskell,Erlang,F#(和其他ML)和Clojure(和其他Schemes / Lisps)都是非常复杂,稳定和成功的,不会很容易被新人替代。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |