找不到类型为 cats.MonadThrow[sttp.client3.Identity] 的证据参数的隐式值

问题描述 投票:0回答:2

我正在考虑在我们的 Scala 项目中使用 stac4s 作为 STAC 客户端,但是天哪,这让我很为难。使用 cats、monads 和所有那些花哨的东西是非常令人生畏的,而且没有文档可言。

我一开始就卡住了:实例化这个东西。

import com.azavea.stac4s.api.client.SttpStacClient
import org.junit.Test
import sttp.client3._

class Stac4sTest {

  @Test
  def testDrive(): Unit = {
    val stacClient = SttpStacClient(client = HttpURLConnectionBackend(), baseUri = uri"") // <-- error here
  }
}

这给了我这个编译错误:

错误:找不到类型为 cats.MonadThrow[sttp.client3.Identity] 的证据参数的隐式值

我假设它很容易像丢失的导入一样,但我找不到它。

这是 stac4s 版本 0.8.1.

scala implicit scala-cats sttp stac4s
2个回答
0
投票

不回答这个具体案例,但提供一些指导 ...

在处理此类错误时,我经常建议查看库的测试,你会以某种方式找出如何实例化事物或缺少什么导入。

例如,您可以先查看https://github.com/azavea/stac4s/blob/master/modules/client/jvm/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec .scala 它将引导您进入其他课程并最终找到缺少的东西。

您的 IDE 也可以提供帮助,建议缺少什么。


0
投票

我从未使用过 stac4s 库,但就实例化基于 sttp+cats 效果的客户端而言,您通常会得到一个

IO
值,它 描述 整个程序及其所有副作用(这里,分配客户端等)。因此,您需要在创建描述后对其进行评估。例如,按照sttp的文档

val program = HttpClientCatsBackend.resource[IO]().use { backend =>
  val stacClient = SttpStacClient(client = backend, baseUri = uri"")
  // other operations
}

program.unsafeRunSync()(cats.effect.unsafe.implicits.global)

unsafeRunSync
执行程序,正如所描述的那样,使用给定的线程池进行任何分叉。

请注意,您无法使用

HttpURLConnectionBackend()
,因为它是同步客户端,而 stac 似乎需要 使用猫效应的后端。

© www.soinside.com 2019 - 2024. All rights reserved.