【发布时间】:2019-02-12 01:07:16
【问题描述】:
给定Resource[F, A],在不使用A(即.use)的情况下将效果(例如指标、日志记录错误)附加到F 的最惯用方式是什么?
我可以使用F[A] 轻松做到这一点,但我依赖一个专门返回Resource[F, A] 的API 来确保A 将被正确释放。
【问题讨论】:
标签: scala scala-cats cats-effect
给定Resource[F, A],在不使用A(即.use)的情况下将效果(例如指标、日志记录错误)附加到F 的最惯用方式是什么?
我可以使用F[A] 轻松做到这一点,但我依赖一个专门返回Resource[F, A] 的API 来确保A 将被正确释放。
【问题讨论】:
标签: scala scala-cats cats-effect
如果我正确理解了这个问题,我会使用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.liftF 提升到 Resource[F, _]。
【讨论】: