如何使用http4s将猫IO变成效果

时间:2018-04-21 12:02:05

标签: scala scala-cats http4s

我有一些返回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]                 ^

1 个答案:

答案 0 :(得分:5)

我们可以使用具体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,因为我们{{1}在猫身上有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) ioConcurrentEffect个实例。

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