帮助我理解这个Scala代码:scalaz IO Monad
发布时间:2020-12-16 18:03:07 所属栏目:安全 来源:网络整理
导读:这是我试图理解的代码(从 http://apocalisp.wordpress.com/2010/10/17/scalaz-tutorial-enumeration-based-io-with-iteratees/开始): object io { sealed trait IO[A] { def unsafePerformIO: A } object IO { def apply[A](a: = A): IO[A] = new IO[A] { d
这是我试图理解的代码(从
http://apocalisp.wordpress.com/2010/10/17/scalaz-tutorial-enumeration-based-io-with-iteratees/开始):
object io { sealed trait IO[A] { def unsafePerformIO: A } object IO { def apply[A](a: => A): IO[A] = new IO[A] { def unsafePerformIO = a } } implicit val IOMonad = new Monad[IO] { def pure[A](a: => A): IO[A] = IO(a) def bind[A,B](a: IO[A],f: A => IO[B]): IO[B] = IO { implicitly[Monad[Function0]].bind(() => a.unsafePerformIO,(x:A) => () => f(x).unsafePerformIO)() } } } 这个代码是这样使用的(我假设导入io._暗示) def bufferFile(f: File) = IO { new BufferedReader(new FileReader(f)) } def closeReader(r: Reader) = IO { r.close } def bracket[A,B,C](init: IO[A],fin: A => IO[B],body: A => IO[C]): IO[C] = for { a <- init c <- body(a) _ <- fin(a) } yield c def enumFile[A](f: File,i: IterV[String,A]): IO[IterV[String,A]] = bracket(bufferFile(f),closeReader(_:BufferedReader),enumReader(_:BufferedReader,i)) 让我们从bufferFile定义开始.我是否认为io.IO的apply方法被调用了?该apply方法采用无参数函数返回一个值(正确?).我想这就是我被困住的地方.有人可以解释一下bufferFile的定义是如何工作的吗? 解决方法
是的,你是对的,差不多;使用所谓的“by name”参数调用io.IO.apply,该参数基本上是一个不带任何东西(Unit)并返回A的函数.很酷的是当你像新的BufferedReader一样直接传递A的实例时(new FileReader(f)),它将被转换为类似()=>的东西新的BufferedReader(新的FileReader(f)).
作为应用的结果,您将获得IO [BufferedReader]的实例,该实例定义了一个方法def unsafePerformIO,它只返回捕获的BufferedReader的实例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |