我在想为什么Scala没有像Haskell那样的IO Monad。
因此,在Scala中,方法readLine
的返回类型是String,而在Haskell中,可比较的函数getLine
的返回类型为IO String。
关于这个主题有一个类似的问题,但它的答案并不令人满意:
在Scala中,使用IO明显不是主流风格。
有人能进一步解释一下吗?为什么Scala没有包括IO Monads的设计决策是什么?
我在想为什么Scala没有像Haskell那样的IO Monad。
因此,在Scala中,方法readLine
的返回类型是String,而在Haskell中,可比较的函数getLine
的返回类型为IO String。
关于这个主题有一个类似的问题,但它的答案并不令人满意:
在Scala中,使用IO明显不是主流风格。
有人能进一步解释一下吗?为什么Scala没有包括IO Monads的设计决策是什么?
>>
或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的对象模型合作(这与纯粹和懒惰完全相反),允许函数式和混合的函数式-面向对象编程,但不强制要求(否则几乎所有Java程序员都会离开)。实际上,拥有又一个完全函数式的语言是没有意义的:有Haskell、Erlang、F#(和其他ML语言)以及Clojure(和其他Scheme / Lisp语言),它们都非常复杂、稳定和成功,并不容易被新手所取代。为什么不将其设计为惰性和纯粹的语言?
putStrLn "First" >> putStrLn "Second"
没有明确定义的执行顺序? - pat>>
而改变。同时请记住,>>
是用于单子而非 IO,因此任何与 IO 相关的细节都不适用。单子并不是严格的,这就是为什么我们有具有不同语义的不同单子的严格版本的原因。 - alternative
getLine
没有“返回类型IO String”。getLine
的类型就是IO String
。因为没有箭头符号“->”,所以它不是一个函数。 - newacctInteger
是零元的;然而,它不是一个函数。同样地,我们可以定义一个类型被称为“深度 n”,意味着嵌套在 n 个[]
中。Integer
的深度为0,[Integer]
的深度为1,[[Integer]]
的深度为2,但只有后两种类型是列表。 - ehird