gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:02:59 28 4
gpt4 key购买 nike

这是我试图理解的代码(来自 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 开始定义。我认为 apply 是否正确? io.IO 的方法被调用?那个 apply方法采用一个无参数函数返回一个值(正确吗?)。我想这就是我被困的地方。有人能解释一下 bufferFile的定义吗?作品?

最佳答案

是的,你是对的,几乎是; io.IO.apply使用所谓的“按名称”参数调用,该参数基本上是一个不带任何东西( Unit )并返回 A 的函数。 .很酷的一点是,当你传递一个 A 的实例时直接点赞 new BufferedReader(new FileReader(f)) ,它将被转换为类似 () => new BufferedReader(new FileReader(f)) 的内容.

由于apply你得到一个 IO[BufferedReader] 的实例它定义了一个方法 def unsafePerformIO它只是返回捕获的实例 BufferedReader .

关于scala - 帮助我理解这个 Scala 代码 : scalaz IO Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7404495/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com