所以我有一个魔术方法应该以{{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[_]
这样的东西直接投射?
答案 0 :(得分:0)
有没有办法对FromTraversable [_]解析时使用的输入类型提供LUBConstraint限制?
看起来没有形状,但您可以创建FromTraversable的自定义版本,根据需要约束def apply(l: GenTraversable[_]): Option[Out]
。
或者更好的是,也许还有一种方法可以使用FromTraversable [Input,LUB,Out]直接投射?
同样,它不是没有形状的,但定义MyFromTraversable
应该很简单,MyFromTraversable.Aux[LUB, Out]
完全符合你的要求。