如何在不使用 A 的情况下将效果附加到 Resource[F, A] 中的 F?
How to attach effects to the F in Resource[F, A] without using A?
给定 Resource[F, A]
,在不使用 A
(即 .use
)的情况下将效果(例如指标、日志记录错误)附加到 F
的最惯用方法是什么?
我可以用 F[A]
轻松做到这一点,但我依赖 API,特别是 returns 和 Resource[F, A]
来确保 A
会正确释放。
如果我正确理解问题,我会使用 Resource.liftF
和 <*
。例如:
import cats.effect.{ IO, Resource }
import cats.syntax.apply._
import scala.io.Source
val src = Resource.fromAutoCloseable(IO(Source.fromFile("build.sbt")))
val log = IO(println("opening file"))
val loggedSrc = src <* Resource.liftF(log)
然后:
scala> val program = loggedSrc.use(s => IO(println(s.mkString)))
program: cats.effect.IO[Unit] = IO1584418
scala> program.unsafeRunSync
opening file
scalaVersion := "2.12.8"
scalacOptions += "-Ypartial-unification"
libraryDependencies += "org.typelevel" %% "cats-effect" % "1.2.0"
一般来说,您将使用与 F
中相同的方法,但使用 Resource.liftF
提升到 Resource[F, _]
。
给定 Resource[F, A]
,在不使用 A
(即 .use
)的情况下将效果(例如指标、日志记录错误)附加到 F
的最惯用方法是什么?
我可以用 F[A]
轻松做到这一点,但我依赖 API,特别是 returns 和 Resource[F, A]
来确保 A
会正确释放。
如果我正确理解问题,我会使用 Resource.liftF
和 <*
。例如:
import cats.effect.{ IO, Resource }
import cats.syntax.apply._
import scala.io.Source
val src = Resource.fromAutoCloseable(IO(Source.fromFile("build.sbt")))
val log = IO(println("opening file"))
val loggedSrc = src <* Resource.liftF(log)
然后:
scala> val program = loggedSrc.use(s => IO(println(s.mkString)))
program: cats.effect.IO[Unit] = IO1584418
scala> program.unsafeRunSync
opening file
scalaVersion := "2.12.8"
scalacOptions += "-Ypartial-unification"
libraryDependencies += "org.typelevel" %% "cats-effect" % "1.2.0"
一般来说,您将使用与 F
中相同的方法,但使用 Resource.liftF
提升到 Resource[F, _]
。