gpt4 book ai didi

scala - 在 http4s 版本 19.0.0 中找不到 ContextShift[cats.effect.IO] 的隐式值

转载 作者:行者123 更新时间:2023-12-02 17:52:52 25 4
gpt4 key购买 nike

我有一个 http4s 项目,它使用 ciris用于配置管理。

项目在github here .

libraryDependencies ++= Seq(
"is.cir" %% "ciris-cats",
"is.cir" %% "ciris-cats-effect",
"is.cir" %% "ciris-core",
"is.cir" %% "ciris-enumeratum",
"is.cir" %% "ciris-refined"
).map(_ % "0.12.1")

libraryDependencies ++= Seq(
"org.http4s" %% "http4s-dsl",
"org.http4s" %% "http4s-blaze-server"
).map(_ % "0.18.18")

libraryDependencies ++= Seq(
"com.ovoenergy" %% "ciris-kubernetes" % "0.5",
"org.typelevel" %% "kittens" % "1.2.0",
"eu.timepit" %% "refined-cats" % "0.9.3"
)

当我编译我的项目时,出现以下错误 here

    [info] Compiling 12 Scala sources to /Users/rajkumar.natarajan/Documents/Coding/OS/ciris-example/target/scala-2.12/classes ...
[error] /Users/rajkumar.natarajan/Documents/Coding/OS/ciris-example/src/main/scala/is/cir/example/application/Http4sApi.scala:24:68: Cannot find an implicit value for ContextShift[cats.effect.IO]:
[error] * import ContextShift[cats.effect.IO] from your effects library
[error] * if using IO, use cats.effect.IOApp or build one with cats.effect.IO.contextShift
[error] implicit val ioConcurrentEffect: Concurrent[IO] = cats.effect.IO.ioConcurrentEffect
[error] ^
[error] /Users/rajkumar.natarajan/Documents/Coding/OS/ciris-example/src/main/scala/is/cir/example/application/Http4sApi.scala:43:69: type mismatch;
[error] found : (ec: scala.concurrent.ExecutionContext, sc: java.util.concurrent.ScheduledExecutorService)cats.effect.Timer[cats.effect.IO] <and> (ec: scala.concurrent.ExecutionContext)cats.effect.Timer[cats.effect.IO]
[error] required: cats.effect.Timer[cats.effect.IO]
[error] Timeout(finite)(service)(ioConcurrentEffect, cats.effect.IO.timer)
[error] ^

原因是我缺少函数 here 所需的隐式参数该错误告诉我使用use cats.effect.IOApp或使用cats.effect.IO.contextShift构建一个,但找不到cats.effect.IOAppcats.effect.IO.contextShift

感谢任何帮助。

最佳答案

several popular usages of implicit其中之一是传递一些“上下文”信息。您看到的代码是这种用法的典型示例。

当您执行“超时”时,您需要决定两件事:

  • 主作业将在何处(在哪个线程上)运行
  • 计时器将在何处(在哪个线程上)被触发,因为在 JVM 世界中(与 JavaScript 不同)没有标准计时器。

这些参数的重要之处在于,一方面它们对工作至关重要,但另一方面它们仅支持主要参数。另一件事是,您可能只想拥有一个(或很少)全局对象,以便在任何地方都可以使用这些对象。这就是它们成为上下文的原因,也是它们被隐式传递的原因。

现在您可以选择从哪里获取它们:

  • 将它们也设置为您的上下文,即强制调用者将它们传递给您(也是隐式的
  • 创建您自己的实例

此选择不是一个简单的设计决策,取决于您将如何使用 API。通常,正确的选择是第一个 - 让它们成为您的背景。通过这种方式,您允许调用者按照其想要的方式设置上下文(例如,Timer 和 Concurrent 应该使用相同的线程池还是不同的线程池?)。有时创建自己的独立上下文是可以的。或者将从外部收到的另一个上下文包装成特定于您的内容。

假设您想将外部上下文包装在 Http4sApi 的边界处,您可以编写如下代码:

final case class Http4sApi()(implicit executionContext: ExecutionContext) extends HttpApiAlg[IO] {
// create IO-specific context from the executionContext
private implicit val cs = IO.contextShift(executionContext)
private implicit val timer = IO.timer(executionContext)

然后你就可以这样写

def withTimeout(timeout: Duration)(service: HttpService[IO]): HttpService[IO] = timeout match {
case finite: FiniteDuration => Timeout(finite)(service)
case _ => service
}

它应该可以编译。

关于scala - 在 http4s 版本 19.0.0 中找不到 ContextShift[cats.effect.IO] 的隐式值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54067736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com