2014-02-10 97 views
1

尋找一個IO Monad例如,從Functional Programming in Scala,我創建了一個SBT項目來測試IO.scala評估`readLine`在SBT

def ReadLine: IO[String] = IO { readLine } 
def PrintLine(msg: String): IO[Unit] = IO { println(msg) } 

def converter: IO[Unit] = for { 
    _ <- PrintLine("Enter a temperature in degrees fahrenheit: ") 
    d <- ReadLine.map(_.toDouble) 
    _ <- PrintLine(fahrenheitToCelsius(d).toString) 
} yield() 

但是,當我運行console從SBT與REPL訪問上面的類,我想:

scala> val echo = Util.ReadLine.flatMap(Util.PrintLine) 
echo: common.I01.IO[Unit] = [email protected] 

我期待被提示輸入在文本輸入(通過readLine),但我看到,我的理解,簡單的匿名函數/類。

我該如何測試上面的代碼?

回答

1

ReadLine上調用flatMap只會產生一個未解釋的值IO[Unit]。在某些時候,你必須調用IO#run(或scalaz IO#unsafePerformIO)使副作用發生

爲了保持參照透明度,一般的想法是建立一個IO[A](其中A通常Unit),並在「最外面的「部分,請在該值上調用run - 例如,從應用程序的主入口點。儘管取決於您所使用的環境 - 例如某種形式的框架或容器,這並不總是容易/可能的。

因爲參照透明度的損失通常被認爲是一個非常嚴重的缺點,所以通常推遲運行IO值儘可能長。因此,在宇宙結束時評估IO是很常見的。

在這種情況下,Universe的結尾是REPL會話,因此請嘗試從REPL調用echo.run

+0

謝謝。當你說「宇宙的末日是REPL會議」時,你能否詳細說明一下?在幾年前掃描Haskell書籍之前,我曾聽過宇宙術語。 –

+0

我剛剛清理了一下術語,並添加了「宇宙末日」短語的基本原理。讓我知道如果這是明確的。 – mpilquist