如何使用 http4s 将猫 IO 转换为 Effect
How do I turn a cats IO into a Effect using http4s
我有一些代码 returns 一个 IO,但我需要一个在 http4s 中的效果。
import cats.effect.{Effect, IO}
class Service[F[_]: Effect] extends Http4sDsl[F] {
val service: HttpService[F] = {
HttpService[F] {
case GET -> Root =>
val data: IO[String] = getData()
data.map(d => Ok(d))
}
}
}
给予
[error] found : cats.effect.IO[F[org.http4s.Response[F]]]
[error] required: F[org.http4s.Response[F]]
[error] data.map(d => Ok(d))
[error] ^
我们可以绕过使用具体 IO[A]
的一种方法是使用 LiftIO[F]
:
class Service[F[_]: Effect] extends Http4sDsl[F] {
val service: HttpService[F] = {
HttpService[F] {
case GET -> Root =>
getData().liftIO[F].flatMap(Ok(_))
}
}
}
LiftIO
升降机将升降:IO[A] => F[A]
,但这会产生我们 F[F[Response[F]
。为了编译,我们将在 F
上 flatten
因为它在猫中有一个 Monad
(或 FlatMap
)实例,因为我们的 Effect
上下文界限要求。
如果我们想要更多细节,这是 -Xprint:typer
结果:
cats.implicits.catsSyntaxFlatten[F, org.http4s.Response[F]](
cats.effect.LiftIO.apply[F](Service.this.evidence)
.liftIO[F[org.http4s.Response[F]]](
data.map[F[org.http4s.Response[F]]](
((d: String) => Service.this.http4sOkSyntax(Service.this.Ok)
.apply[String](d)(Service.this.evidence,
Service.this.stringEncoder[F](
Service.this.evidence, Service.this.stringEncoder$default[F]))))))(Service.this.evidence).flatten(Service.this.evidence)
而在世界的尽头,当你想给出一个具体的效果时,例如Service[IO]
,我们得到:
val serv: Service[cats.effect.IO] =
new Service[cats.effect.IO]()(effect.this.IO.ioConcurrentEffect)
其中 ioConcurrentEffect
是 Effect[IO]
实例。
似乎所有的好东西都定义在org.http4s.syntax.AllSyntax
trait.
我有一些代码 returns 一个 IO,但我需要一个在 http4s 中的效果。
import cats.effect.{Effect, IO}
class Service[F[_]: Effect] extends Http4sDsl[F] {
val service: HttpService[F] = {
HttpService[F] {
case GET -> Root =>
val data: IO[String] = getData()
data.map(d => Ok(d))
}
}
}
给予
[error] found : cats.effect.IO[F[org.http4s.Response[F]]]
[error] required: F[org.http4s.Response[F]]
[error] data.map(d => Ok(d))
[error] ^
我们可以绕过使用具体 IO[A]
的一种方法是使用 LiftIO[F]
:
class Service[F[_]: Effect] extends Http4sDsl[F] {
val service: HttpService[F] = {
HttpService[F] {
case GET -> Root =>
getData().liftIO[F].flatMap(Ok(_))
}
}
}
LiftIO
升降机将升降:IO[A] => F[A]
,但这会产生我们 F[F[Response[F]
。为了编译,我们将在 F
上 flatten
因为它在猫中有一个 Monad
(或 FlatMap
)实例,因为我们的 Effect
上下文界限要求。
如果我们想要更多细节,这是 -Xprint:typer
结果:
cats.implicits.catsSyntaxFlatten[F, org.http4s.Response[F]](
cats.effect.LiftIO.apply[F](Service.this.evidence)
.liftIO[F[org.http4s.Response[F]]](
data.map[F[org.http4s.Response[F]]](
((d: String) => Service.this.http4sOkSyntax(Service.this.Ok)
.apply[String](d)(Service.this.evidence,
Service.this.stringEncoder[F](
Service.this.evidence, Service.this.stringEncoder$default[F]))))))(Service.this.evidence).flatten(Service.this.evidence)
而在世界的尽头,当你想给出一个具体的效果时,例如Service[IO]
,我们得到:
val serv: Service[cats.effect.IO] =
new Service[cats.effect.IO]()(effect.this.IO.ioConcurrentEffect)
其中 ioConcurrentEffect
是 Effect[IO]
实例。
似乎所有的好东西都定义在org.http4s.syntax.AllSyntax
trait.