样本Simple IO Type如何摆脱“FP in Scala”中的副作用?
我正在阅读第13.2.1节,并且遇到了可以处理IO输入并在此期间摆脱副作用的示例:
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真的有用吗? 解决方法
> IO的定义如下:
trait IO { def run: Unit } 根据该定义,您可以理解编写新IO [A] {def run = a}意味着从您的特征初始化匿名类,并将a指定为调用IO.run时运行的方法.因为a是by name parameter,所以在创建时实际上没有任何内容. def apply[A](a: => A): IO[A] = unit(a) 允许扩张.因此我们实际上调用了IO.apply(readLine). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |