gpt4 book ai didi

scala - 如何使用 http4s 将 cats IO 转换为 Effect

转载 作者:行者123 更新时间:2023-12-01 19:24:01 31 4
gpt4 key购买 nike

我有一些返回 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] 。为了编译,我们将 flattenF因为它有 Monad (或 FlatMap )猫中的实例,由于我们的 Effect上下文边界要求。

如果我们想要更多详细信息,请输入 -Xprint:typer结果:

cats.implicits.catsSyntaxFlatten[F, org.http4s.Response[F]](
cats.effect.LiftIO.apply[F](Service.this.evidence$1)
.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$1,
Service.this.stringEncoder[F](
Service.this.evidence$1, Service.this.stringEncoder$default$2[F]))))))(Service.this.evidence$1).flatten(Service.this.evidence$1)

在世界末日,当你想要给出具体的效果时,例如 Service[IO] ,我们得到:

val serv: Service[cats.effect.IO] = 
new Service[cats.effect.IO]()(effect.this.IO.ioConcurrentEffect)

哪里ioConcurrentEffectEffect[IO]实例。

似乎所有好东西都定义在 org.http4s.syntax.AllSyntax 特质。

关于scala - 如何使用 http4s 将 cats IO 转换为 Effect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49955558/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com