Я читаю главу 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
?
- В функции
ReadLine
что на самом деле делает IO { readLine }
? Будет ли он действительно выполнять функцию println
или просто вернет тип ввода-вывода?
- Что означает
_
в понимании (_ <- PrintLine("Enter a temperature in degrees Fahrenheit: ")
)?
- Почему он устраняет побочные эффекты ввода-вывода? Я видел, что эти функции все еще взаимодействуют с входами и выходами.