加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:03:07 所属栏目:安全 来源:网络整理
导读:这是我试图理解的代码(从 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] { d
这是我试图理解的代码(从 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的实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读