在版本上:
"org.typelevel" %% "scodec-core" % "1.5.0"
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用coproduct功能,如测试用例中所示,将编解码器修复为已知的子类型.
我一直收到错误:"找不到参数auto的隐含值:scodec.codecs.CoproductBuilderAuto [my.class.here]"
我甚至复制粘贴的例子,无法让它工作:
import scalaz.\/
import shapeless._
import scodec.bits._
import scodec.codecs._
import scodec._
sealed trait Sprocket
object Sprocket {
implicit val discriminated: Discriminated[Sprocket, Int] = Discriminated(uint8)
}
def codec(d: Int): Codec[Sprocket] = Codec.coproduct[Sprocket].discriminatedBy(provide(d)).auto
Run Code Online (Sandbox Code Playgroud)
我会在最后继续研究这个问题,但是想知道最近是否有一个问题已经解决了.我克隆了repo,它从克隆开始工作 - 但是当我使用发布的版本时却没有.
示例代码中的错误是由于没有Sprocket定义任何子类型引起的.如果至少有1 Sprocket个子类型,则Shapeless能够生成一个LabelledGeneric[Sprocket]实例,其中表示是一个有区别的联合.联合是标记的亚型的副产品.
添加以下内容可解决错误:
case class Woozle(x: Int, y: Int) extends Sprocket
object Woozle {
implicit val discriminator: Discriminator[Sprocket, Woozle, Int] = Discriminator(1)
implicit val codec: Codec[Woozle] = (uint8 :: uint8).as[Woozle]
}
Run Code Online (Sandbox Code Playgroud)
请注意,您需要同伴中的discriminator和codecimplicits.如果discriminator未定义,您将收到报告的错误.如果codec未定义,则会出现分歧的隐式错误.从理论上讲,Woozle如果Codec[Int]范围中存在隐含的内容,则可以自动派生编解码器,但是scalac不能完成任务 - 相反,它会出现分歧的隐式扩展错误.我们希望通过Shapeless 2.1改进这一点.
供参考,完整来源:
import scalaz.\/
import shapeless._
import scodec.bits._
import scodec.codecs._
import scodec._
sealed trait Sprocket
object Sprocket {
implicit val discriminated: Discriminated[Sprocket, Int] = Discriminated(uint8)
}
case class Woozle(x: Int, y: Int) extends Sprocket
object Woozle {
implicit val discriminator: Discriminator[Sprocket, Woozle, Int] = Discriminator(1)
implicit val codec: Codec[Woozle] = (uint8 :: uint8).as[Woozle]
}
object Main extends App {
def codec(d: Int): Codec[Sprocket] = Codec.coproduct[Sprocket].discriminatedBy(provide(d)).auto
}
Run Code Online (Sandbox Code Playgroud)
并建立:
scalaVersion := "2.11.4"
libraryDependencies += "org.typelevel" %% "scodec-core" % "1.5.0"
Run Code Online (Sandbox Code Playgroud)