Voici le code que je suis en train de comprendre (c'est de http://apocalisp.wordpress.com/2010/10/17/scalaz-tutorial-enumeration-based-io-with-iteratees/):Aidez-moi à comprendre ce code Scala: scalaz monade IO
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)()
}
}
}
Ce code est utilisé comme ceci (je suppose une import io._
est implicite)
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))
Commençons par la définition bufferFile
. Ai-je raison de penser que la méthode apply
de io.IO est appelée? Cette méthode apply
prend une fonction sans paramètre qui renvoie une valeur (correct?). Je suppose que c'est là où je suis coincé. Quelqu'un peut-il expliquer comment fonctionne la définition de bufferFile
?