Scala-如何从Hammock中的IO[HttpResponse]获取数据



我有一个简单的方法:

def retrieveRepositories(url: String, params: String): IO[HttpResponse] = Hammock.getWithOpts(uri"$url", createOpts).exec[IO]

它是一个http客户端。和json解码器:

implicit def decodeResponseEntity(response: HttpResponse): Either[CodecException, List[GitRepository]] = Decoder[List[GitRepository]].decode(response.entity)

现在我想这样称呼这个客户:

def getRepos(organization: String, params: String): F[Either[CodecException, List[GitRepository]]] = for {
res <- retrieveRepositories(organization, params)
result <- Sync[F].delay(decodeResponseEntity(res))
} yield result

但是,result <- Sync[F].delay(decodeResponseEntity(res))行有一个问题,因为我得到了一个错误:Type mismatch. Reguired: IO[B_] but found F[Either[CodecException, List[GitRepository]]]。当我把unsafeRunSync()方法添加到retrieveRepositories(organization, params)中时,它可以正常工作,但我应该在最后调用这个方法,而不是在这里。我该怎么修?

如果可以,您可能需要更改retrieveRepositories的定义,并对效果类型(F(进行参数化,而不是使用具体的IO类型。

如果不能更改retrieveRepositories,请在getRepos中添加一个隐式LiftIO约束。您将能够使用liftIO方法将具体的IO值提升到F中。另一种选择是使用Async类型类,它继承自SyncLiftIO

参见liftIO的文档:https://typelevel.org/cats-effect/typeclasses/liftio.html

最新更新