从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}}?
答案 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个输入提示的原因。