2014-02-10 1 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, чтобы получить доступ к выше класса с РЕПЛ, Я пробовал:

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

Я ожидаю, что будет предложено для ввода текста (через readLine), но я вижу, как я понимаю, просто анонимную функцию/класс.

Как я могу проверить вышеуказанный код?

ответ

1

Звонок flatMap на ReadLine только что дал значение IO[Unit], которое не было интерпретировано. В какой-то момент, вы должны вызвать IO#run (или IO#unsafePerformIO в scalaz), чтобы побочные эффекты случаются

Чтобы сохранить ссылочную прозрачность, общая идея заключается в том, чтобы наращивать IO[A] (где A обычно Unit) и в " внешняя "часть вашей программы, вызовите run на значение - например, из основной точки входа приложения. Это не всегда легко/возможно, хотя в зависимости от среды, в которой вы работаете, например, в какой-то форме каркаса или контейнера.

Поскольку потеря ссылочной прозрачности обычно считается довольно серьезным недостатком, обычно следует отсрочить выполнение значения IO как можно дольше. Следовательно, принято говорить, что IO оценивается в конце Вселенной.

В этом случае конец юниверса является сеансом REPL, поэтому попробуйте позвонить echo.run из REPL.

+0

спасибо. Когда вы говорите, что «конец Вселенной - это сеанс REPL», не могли бы вы рассказать подробнее? Я слышал термин вселенной перед тем, как сканировать книгу Хаскелла несколько лет назад. –

+0

Я просто немного очистил терминологию и добавил логическое обоснование фразы «конец вселенной». Дайте мне знать, если это ясно. – mpilquist