这是我试图理解的代码(从
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的定义是如何工作的吗?