[英]Help me understand this Scala code: scalaz IO Monad and implicits
[英]Help me understand this Scala code: 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)()
}
}
}
這個代碼是這樣使用的(我假設import 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
的定義是bufferFile
工作的嗎?
是的,你是對的,差不多; 使用所謂的“by name”參數調用io.IO.apply
,該參數基本上是一個不帶任何東西( Unit
)並返回A
的函數。 很酷的是,當你像new BufferedReader(new FileReader(f))
一樣直接傳遞A
的實例時,它將被轉換為類似於() => new BufferedReader(new FileReader(f))
。
作為結果apply
你會得到一個實例IO[BufferedReader]
定義的方法def unsafePerformIO
它簡單的返回捕獲實例BufferedReader
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.