IO Monad #map功能

时间:2014-02-11 02:40:34

标签: scala monads

Functional Programming in Scala查看IO Monad,我看到以下代码:

I0.scala

def ReadLine: IO[String] = IO { readLine }

I0Test.scala

val readInt = ReadLine.map(_.toInt)
val result: Int = readInt * readInt

当我在我的一个ScalaTests中运行上面一行时,控制台等待我输入2个输入。

输入两个数字后,2个输入的产品存储在result中。在致电ReadLine.map(_.toInt)时,map是否会调用将其输出转换为run的{​​{1}}?

1 个答案:

答案 0 :(得分:1)

看看这段代码:

scala> def ReadLine: Option[String] = Some(readLine)
ReadLine: Option[String]

scala> val readInt = ReadLine.map(_.toInt)
java.lang.NumberFormatException: For input string: "asd"

在这个原始示例中,急切地评估readline并抛出错误。另外需要注意的是readInt这里是变量,而不是函数。

在我的例子中,我相信(没有提供代码但是“根据书籍”)在调用map时会创建一个新的monad,并且尚未评估map的结果。这也使得readInt成为一种不带args的函数,可以通过简单地调用它来应用,当你执行readInt * readInt时会发生这种情况,这就是你得到2个输入提示的原因。