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,为什么要隐式传递呢? hash
和 namedDecoder
之类的东西从何而来?这些感觉就像普通参数。
我仍在学习 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,为什么要隐式传递呢? hash
和 namedDecoder
之类的东西从何而来?这些感觉就像普通参数。