2

给定 a ,在不使用(ie ) 的情况下Resource[F, A]附加效果(例如指标、日志记录错误)的最惯用方式是什么?FA.use

我可以用 a 轻松做到这一点,F[A]但我依赖一个专门返回 a 的 APIResource[F, A]来确保它A会被正确发布。

4

1 回答 1

4

如果我正确理解了这个问题,我会使用Resource.liftFand <*。例如:

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"

通常,您将使用与 in 相同的方法F,但将其提升为Resource[F, _]with Resource.liftF

于 2019-02-12T12:45:49.520 回答