2014-02-11 55 views
0

Functional Programming in Scala望着單子IO,我看到了下面的代碼:IO單子#地圖功能

I0.scala

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

I0Test.scala

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

當我在我的一個ScalaTests中運行上面的行時,控制檯wa它爲我輸入2個輸入。

輸入兩個數字後,2個輸入的產品存儲在result中。當致電ReadLine.map(_.toInt)時,map是否會致電run將其輸出轉換爲Int

回答

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是一種不需要任何參數的功能,可以通過簡單地調用它來應用,當您執行readInt * readInt時會發生這種情況,這就是爲什麼您會得到2個輸入提示。