首页 > 解决方案 > 如何包装有效的 F 而不是具体的类型构造函数?

问题描述

我有以下函数定义:

  private val checkSapHealth: IO[ServerHealth] =
    BlazeClientBuilder[IO](global).resource.use { client =>
      discovery
        .senderAddr
        .flatMap { addr =>
          client
            .get(addr.url |+| addr.health) { res =>
              res.status match {
                case Ok =>
                  IO(ServerOnline)
                case _ =>
                  IO(ServerOffline)
              }
            }
            .timeout(2.second)
            .recover {
              case _: Throwable => ServerOffline
            }

        }
    }

我想通过替换具体类型IOF[_]使其更抽象。这里的问题是:

IO(ServerOnline)

问题是如何做到

F(ServerOnline)

标签: scalafunctional-programmingscala-catscats-effect

解决方案


尝试使用cats.effect.Sync

https://typelevel.org/cats-effect/typeclasses/sync.html

所以基本上 usingSync[IO].delay等价于 using IO.apply

private def checkSapHealth[F[_]: Sync]: F[ServerHealth] = ...

推荐阅读