簡體   English   中英

Scala - 如何從 Hammock 中的 IO[HttpResponse] 獲取數據?

[英]Scala - how to get data from IO[HttpResponse] in Hammock?

我有一個簡單的方法:

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]]] 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM