0

我有一个简单的方法:

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)它可以正常工作,但我应该在最后而不是在这里调用这个方法。我应该如何修复它?

4

1 回答 1

1

如果可以,您可能希望更改retrieveRepositories效果类型 ( F) 的定义和参数化,而不是使用具体IO类型。

如果无法更改retrieveRepositories,请LiftIOgetRepos. 您将能够使用liftIO方法将具体IO值提升到F. 另一种方法是使用Asynctypeclass,它继承自SyncLiftIO

请参阅文档liftIOhttps ://typelevel.org/cats-effect/typeclasses/liftio.html

于 2019-11-11T01:29:03.480 回答