gpt4 book ai didi

scala - 带标记类型的解码案例类

转载 作者:行者123 更新时间:2023-12-04 14:23:08 25 4
gpt4 key购买 nike

鉴于:

鉴于以下关于 Ammonite:

@ import $ivy.`io.circe::circe-core:0.9.0` 

@ import $ivy.`io.circe::circe-generic:0.9.0`

@ import $ivy.`com.chuusai::shapeless:2.3.3`

@ import shapeless.tag
import shapeless.tag

@ trait Foo
defined trait Foo

@ import io.circe._, io.circe.generic.semiauto._
import io.circe._, io.circe.generic.semiauto._

@ import shapeless.tag.@@
import shapeless.tag.@@

@ implicit def taggedTypeDecoder[A, B](implicit ev: Decoder[A]): Decoder[A @@ B] =
ev.map(tag[B][A](_))
defined function taggedTypeDecoder

给定一个 Foo :
@ case class F(x: String @@ Foo)  
defined class F

我可以召唤 Decoder[String @@ Foo] :
@ Decoder[String @@ Foo] 
res17: Decoder[String @@ Foo] = io.circe.Decoder$$anon$21@16b32e49

但不是 F :
@ deriveDecoder[F] 
cmd18.sc:1: could not find Lazy implicit value of type io.circe.generic.decoding.DerivedDecoder[ammonite.$sess.cmd16.F]
val res18 = deriveDecoder[F]
^
Compilation Failed

如何获得 Decoder[F] ?

最佳答案

这是无形中的一个错误'Lazy - milessabin/shapeless#309

我有一个 PR 可以编译您的示例 - milessabin/shapeless#797 (我检查过 publishLocal )

基本上是 Lazy 中的问题是它过于急切地扩展类型别名( A @@ BA with Tagged[B] 的类型别名),这反过来又会触发 Scala 错误 - scala/bug#10506

Scala 错误没有明确的解决方案。这是使类型推断复杂化的子类型与参数多态性问题的另一个体现。它的要点是 Scala 必须同时执行子类型检查和类型推断。但是当我们放置一些类型变量时,如 AB采用精致的类型,如 A with Tagged[B] (实际上,circe 最终会寻找 FieldType[K, A with Tagged[B]] 其中 FieldType 是另一个隐藏精炼类型的类型别名),必须单独检查每个组件的子类型。这意味着我们选择检查组件的顺序决定了类型变量 AB会受到约束。在某些情况下,它们最终会受到过度或不足的约束,并且无法正确推断。

Apropo,无形测试显示 workaround ,但我认为它不适用于 circe,因为它使用某种宏而不是进行 vanilla 类型类派生。

长话短说,您可以:

  • 等待一个无形的(请投票 #797)和随后的循环发布
  • 不使用标记类型 =/
  • 尝试使用不经过精炼或结构化类型的不同编码 - 也许 alexknvl/newtypes ? (没试过)
  • 关于scala - 带标记类型的解码案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48174799/

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