帮助我理解这个Scala代码:scalaz IO Monad

前端之家收集整理的这篇文章主要介绍了帮助我理解这个Scala代码:scalaz IO Monad前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我试图理解的代码(从 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的实例.

猜你在找的Scala相关文章