Scodec - Coproducts找不到参数auto的隐含值:scodec.codecs.CoproductBuilderAuto

时间:2014-11-15 02:55:55

标签: scala scodec

版本:

"org.typelevel" %% "scodec-core" % "1.5.0"

我正在尝试使用coproduct功能,如测试用例demonstrate fixing the codec to a known subtype中所示。

我一直收到错误:“找不到参数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

我会在最后继续研究这个问题,但是想知道最近这个问题是否已经解决了。我克隆了repo,它在克隆中起作用 - 但是当我使用发布的版本时却没有。

1 个答案:

答案 0 :(得分:5)

示例代码中的错误是由于未定义Sprocket的任何子类型引起的。如果至少有一个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]
}

请注意,您需要同伴中的discriminatorcodec含义。如果未定义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
}

并建立:

scalaVersion := "2.11.4"

libraryDependencies += "org.typelevel" %% "scodec-core" % "1.5.0"