如何在不使用A的情况下将效果附加到Resource [F,A]中的F?

时间:2019-02-12 01:07:16

标签: scala scala-cats cats-effect

考虑到Resource[F, A],最常见的方法是在不使用F(即A)的情况下将效果(例如度量标准,记录错误)附加到.use上? / p>

我可以轻松地使用F[A]来做到这一点,但是我依赖于专门返回Resource[F, A]的API,以确保A会被正确释放。

1 个答案:

答案 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