簡體   English   中英

幫助我理解這個Scala代碼:scalaz IO Monad

[英]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

補充阿格萊斯鋼鐵公司的答案 ,代碼

def bufferFile(f: File) = IO {   new BufferedReader(new FileReader(f)) }

相當於

def bufferFile(f: File) = new IO[A] {
  def unsafePerformIO = { new BufferedReader(new FileReader(f)) }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM