我具有以下功能定义:
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
}
}
}
我想将具体类型IO
替换为F[_]
,以使其更抽象。这里的问题是这行:
IO(ServerOnline)
问题是如何使它变为
F(ServerOnline)
尝试使用cats.effect.Sync
https://typelevel.org/cats-effect/typeclasses/sync.html
因此,基本上,使用
Sync[IO].delay
等同于使用IO.apply
。
private def checkSapHealth[F[_]: Sync]: F[ServerHealth] = ...
使用ConcurrentEffect并将F约束为可应用的,从而使您可以选择将值提升到F上下文中>]
private def checkSapHealth[F[_] : Applicative](implicit A: ConcurrentEffect[F]): F[ServerHealth] =
BlazeClientBuilder[F](global).resource.use { client =>
discovery
.senderAddr
.flatMap { addr =>
client
.get(addr.url |+| addr.health) { res =>
res.status match {
case Ok =>
A.pure(ServerOnline)
case _ =>
A.pure(ServerOffline)
}
}
.timeout(2.second)
.recover {
case _: Throwable => ServerOffline
}
}
}