gpt4 book ai didi

scala - 委托(delegate)给更具体的上下文绑定(bind)(附加隐式参数)

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

我正在尝试创建一个 ZIO 模块的示例,它有两种实现:

  • 使用 YAML 和 circe-yaml
  • 将 HOCON 与 pureConfig
  • 一起使用

    我的一般界面如下所示:
    trait Service[R] {
    def load[T <: Component](ref: CompRef): RIO[R, T]
    }

    现在我的 YAML 实现看起来像:
    def loadYaml[T <: Component: Decoder](ref: CompRef): RIO[Any, T] = {...}
    Decoder是特定于实现的。

    现在的问题是如何从服务实现委托(delegate)给 loadYaml。 .

    我尝试了以下方法:
    val components: Components.Service[Any] = new Components.Service[Any] {

    implicit val decodeComponent: Decoder[Component] =
    List[Decoder[Component]](
    Decoder[DbConnection].widen,
    ...
    ).reduceLeft(_ or _)

    def load[T <: Component](ref: CompRef): RIO[Any, T] = loadYaml[T] (ref)
    }

    这给了我:
    Error:(62, 20) could not find implicit value for evidence parameter of type io.circe.Decoder[T]
    loadYaml[T] (ref)

    有没有办法做到这一点?

    我在 Github 上创建了一个示例项目: zio-comps-module

    这个想法在这里描述: Decouple the Program from its Implementation with ZIO modules

    最佳答案

    好的,我找到了解决方案。我所要做的就是调整load功能:

    def load[T <: Component](ref: CompRef): RIO[ComponentsEnv, T] = {
    loadConf[Component](ref).map { case c: T => c }
    }

    loadConf类型为 Component .

    第二个转换结果 ( Component ) 结果类型 T .

    这可行,但会给您带来难看的警告:
    [warn] /Users/mpa/dev/Github/pme123/zio-comps-module/hocon/src/pme123/zio/comps/hocon/HoconComps.scala:37:46: abstract type pattern T is unchecked since it is eliminated by erasure
    [warn] loadConf[Component](ref).map { case c: T => c }
    [warn] ^
    [warn] /Users/mpa/dev/Github/pme123/zio-comps-module/hocon/src/pme123/zio/comps/hocon/HoconComps.scala:37:36: match may not be exhaustive.
    [warn] It would fail on the following inputs: DbConnection(_, _, _, _), DbLookup(_, _, _, _), MessageBundle(_, _)
    [warn] loadConf[Component](ref).map { case c: T => c }
    [warn] ^
    [warn] two warnings found

    更新 - 我找到了一个消除警告的解决方案:

    看完警告 unchecked since it is eliminated by erasure第十次,我记得这可以通过添加 ClassTag 来解决作为上下文绑定(bind)。

    该服务现在看起来
    trait Service[R] {
    def load[T <: Component: ClassTag](ref: CompRef): RIO[R, T]
    }

    关于scala - 委托(delegate)给更具体的上下文绑定(bind)(附加隐式参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59225054/

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