Scala Circe - 扩展解码器没有隐式参数

Scala Circe - Extending Decoder getting no implicit arguments

我仍在学习 scala 并尝试使用 circe 的解码器,但我认为 运行 在上下文绑定方面遇到了一些麻烦。我不确定为什么 scala 需要这个隐式参数?

 abstract class Input[A](namedDecoder: String) extends Decoder[A]
  abstract class Test[T: Input](args: Int)

  case class InputImpl(hash: String, namedDecoder: String) extends Input(namedDecoder)
  class TestImpl(x: Int) extends Test[InputImpl](x)

我收到一个错误:没有 Input[InputImpl] 类型的隐式参数,我有点困惑我在这里遗漏了什么。感谢您的帮助!

实际上,我认为您不希望 Input 成为 Decoder,而是希望 Decoder 与其相关联。

检查此代码:

abstract class Input[A](namedDecoder: String)
final case class InputImpl(hash: String, namedDecoder: String) extends Input(namedDecoder)

abstract class Test[T <: Input : Decoder](args: Int)
class TestImpl(x: Int) extends Test[InputImpl](x)

不然,我真的不明白你需要做什么,但也许是这样的?

trait Input[A] {
  def decoder: Decoder[A]
  def namedDecoder: String
}
object Input {
  final class InputImpl[A](
      val hash: String,
      override final val namedDecoder: String,
      override final val decoder: Decoder[A]
  ) extends Input[A]
  
  implicit final def fromDecoder[A](implicit ev: Decoder[A]): Input[A] =
    new InputImpl(hash = "someHash", namedDecoder = "someName", decoder = ev)
}

abstract class Test[T: Input](args: Int)
final class TestImpl(x: Int) extends Test[String](x)

虽然Input感觉不像是typeclass,为什么要隐式传递呢? hashnamedDecoder 之类的东西从何而来?这些感觉就像普通参数。