考虑到Resource[F, A]
,最常见的方法是在不使用F
(即A
)的情况下将效果(例如度量标准,记录错误)附加到.use
上? / p>
我可以轻松地使用F[A]
来做到这一点,但是我依赖于专门返回Resource[F, A]
的API,以确保A
会被正确释放。
答案 0 :(得分:3)
如果我正确理解了该问题,则可以使用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] = IO$201584418
scala> program.unsafeRunSync
opening file
scalaVersion := "2.12.8"
scalacOptions += "-Ypartial-unification"
libraryDependencies += "org.typelevel" %% "cats-effect" % "1.2.0"
通常,您会使用与F
中相同的方法,但是会使用Resource[F, _]
进入Resource.liftF
。