Я читаю главу 13.2.1 и наткнулся на пример, который может обрабатывать ввод ввода-вывода и тем временем избавляться от побочных эффектов:
object IO extends Monad[IO] {
def unit[A](a: => A): IO[A] = new IO[A] { def run = a }
def flatMap[A,B](fa: IO[A])(f: A => IO[B]) = fa flatMap f
def apply[A](a: => A): IO[A] = unit(a)
}
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 ()
У меня есть пара вопросов относительно этого фрагмента кода:
- Что на самом деле делает
def run = a
в функцииunit
? - Что на самом деле делает
IO { readLine }
в функцииReadLine
? Будет ли он действительно выполнять функциюprintln
или просто возвращать тип ввода-вывода? - Что означает
_
для понимания (_ <- PrintLine("Enter a temperature in degrees Fahrenheit: ")
)? - Почему он удаляет побочные эффекты ввода-вывода? Я видел, что эти функции все еще взаимодействуют с входами и выходами.