从具有多个强制转换的可遍历隐式冲突中变形

时间:2016-07-31 14:05:45

标签: scala shapeless

所以我有一个魔术方法应该以{{1​​}}作为输入,按名称获取其字段列表,类型列表,将它们与数据库对象一起压缩,并映射到case class results获取相同poly的实例。

想象一下,您正在从case class解析case class,并且您有一组预定义的类型类。鉴于案例类的字段是具有可用DatabaseResult类型类的类型,此方法仅围绕可能的解析器组合进行自动化。

DatabaseResult => ScalaType

它失败的位有点儿有趣。我需要将 object results extends Poly1 { implicit def extractor[T : Extractor] = at[((T, String), UDTValue)] { case ((value, fieldName), row) => { Extractor[T].apply(fieldName, row) } } def extractor[ V1 <: Product, Out <: HList, ExOut <: HList, Fields <: HList, RowList <: HList, ZippedPair <: HList, Result <: HList ](v1: V1, row: Row)( implicit tag: TypeTag[V1], gen: Generic.Aux[V1, Out], fl: FromTraversable[Fields], fl2: FromTraversable[RowList], zipper: Zip.Aux[Out :: Fields :: HNil, ExOut], zipper2: Zip.Aux[ExOut :: RowList :: HNil, ZippedPair], ext: Mapper.Aux[results.type, ZippedPair, Result], reifier: Generic.Aux[Result, V1] ): Option[V1] = { for { accessors <- Some(classAccessors[V1]) rows <- List.tabulate(accessors.size)(_ => row).toHList[RowList] fields <- accessors.toHList[Fields] } yield { reifier to ((((gen to v1) zip fields) zip rows) map results) } } 和随后的List[String]提升为List[UDTValue],以便将它们与来自HList的输出类型列表一起压缩并对其应用多边形

但是这些含义会发生冲突,因为它们唯一的约束是Generic.Aux[CaseClassType, Out],因此您最终需要有2 Hlist个定义才能从FromTraversable转到List[T]

问:如果没有HList[T]个实例,有没有更简单的方法来实现这一目标?

问:有没有办法对FromTraversable[]解析时使用的输入类型提供LUBConstraint限制?

问:或者更好的是,也许有一种方法可以使用像FromTraversable[_]这样的东西直接投射?

1 个答案:

答案 0 :(得分:0)

  

有没有办法对FromTraversable [_]解析时使用的输入类型提供LUBConstraint限制?

看起来没有形状,但您可以创建FromTraversable的自定义版本,根据需要约束def apply(l: GenTraversable[_]): Option[Out]

  

或者更好的是,也许还有一种方法可以使用FromTraversable [Input,LUB,Out]直接投射?

同样,它不是没有形状的,但定义MyFromTraversable应该很简单,MyFromTraversable.Aux[LUB, Out]完全符合你的要求。

相关问题