【问题标题】:How to attach effects to the F in Resource[F, A] without using A?如何在不使用 A 的情况下将效果附加到 Resource[F, A] 中的 F?
【发布时间】:2019-02-12 01:07:16
【问题描述】:

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

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

【问题讨论】:

    标签: scala scala-cats cats-effect


    【解决方案1】:

    如果我正确理解了这个问题,我会使用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, _]

    【讨论】:

    • 不错。我实际上很接近,但因 Intellij 无法编译此类代码而偏离了方向……谢谢!
    • productL 在资源类实例中不存在
    • 应用[Resource[IO, ?]].productL(src)(Resource.liftF(log))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2020-06-17
    • 2021-07-06
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多