问题描述
我想使用Decoder[A]
为任意案例类派生某种类型(shapeless
)的实例。
trait Decoder[A] extends Serializable { self =>
def decode(source: String): Either[Throwable,A]
}
final implicit def genericDecoder[A,H <: HList](
implicit gen: LabelledGeneric.Aux[A,H],hDecoder: Lazy[Decoder[H]]
): Decoder[A] = value => hDecoder.value.decode(value).map(gen.from)
final implicit val hnilDecoder: Decoder[HNil] = ???
final implicit def hlistDecoder[K <: Symbol,H,T <: HList](
implicit witness: Witness.Aux[K],hDecoder: Lazy[Decoder[H]],tDecoder: Lazy[Decoder[T]]
): Decoder[FieldType[K,H] :: T] = ???
现在,我希望能够为无法解码的字段使用默认值。在这种情况下,我尝试了这种方法(添加了额外的抽象层):
trait DecoderWithDefaults[A,B] extends Serializable {
def decode(value: String,defaults: B): Either[Throwable,A]
}
final implicit def genericDecoder[A,H <: HList,HD <: HList](
implicit gen: LabelledGeneric.Aux[A,defaults: Default.AsOptions.Aux[A,HD],hDecoder: Lazy[DecoderWithDefaults[H,HD]]
): Decoder[A] = value => hDecoder.value.decode(value,defaults()).map(gen.from)
final implicit val hnilDecoder: DecoderWithDefaults[HNil,HNil] = (_,_) => Right(HNil)
final implicit def hlistDecoder[K <: Symbol,T <: HList,TD <: HList](
implicit witness: Witness.Aux[K],Option[H]]],tDecoder: Lazy[DecoderWithDefaults[T,TD]]
): DecoderWithDefaults[FieldType[K,H] :: T,Option[H] :: TD] = ???
所以,我的问题是:是否可以实现相同的目的,而无需使用其他抽象层(在这种情况下,像DecoderWithDefaults
)?像这样:
final implicit def hlistDecoder[K <: Symbol,defaultValueHead: Option[H],H] :: T] = ???
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)