4
同じ名前のフィールドでも同じ値ではなく2つのレコードを整列させる方法を知っていますか?別のものがOptionで折り返された値を持ちます。順序は、私はまったく同じタイプの2つのレコードを揃えることができ、タイプが1つを強要されていないが、彼らはキーで整列する必要がある場合でも、私は2つのレコードをzipWithを行うことができます異なるタイプの同じラベルを整列させた形の整列
import shapeless._
import shapeless.labelled.{FieldType, field}
import shapeless.ops.hlist.{Align, ToTraversable, ZipWith}
object ShapelessTest {
def zipClasses[A, B, P <: Poly2, ARepr <: HList, BRepr <: HList, R <: HList, X]
(a: A, b: B, f: P)(
implicit
aGen : LabelledGeneric.Aux[A, ARepr],
bGen : LabelledGeneric.Aux[B, BRepr],
// align : Align[ARepr, BRepr],
zipWith : ZipWith.Aux[ARepr, BRepr, P, R],
toTrav: ToTraversable.Aux[R, List, X]
): List[X] =
aGen.to(a).zipWith(bGen.to(b))(f).toList
// align.apply(aGen.to(a)).zipWith(bGen.to(b))(f).toList
def main(args: Array[String]): Unit = {
case class Column[A](value: A)
case class DTable(id: Column[Long], s2: Column[Int], s: Column[String])
case class DFilter(id: Option[Long], s: Option[String], s2: Option[Int])
object filter extends Poly2 {
implicit def repr[K <: Symbol, V] = at[FieldType[K, Column[V]], FieldType[K, Option[V]]] { (a, b) =>
field[K]((a, b).asInstanceOf[(Any, Any)])
}
}
val dTable = new DTable(Column(1L), Column(3), Column("s"))
val dFilter = new DFilter(Option(222L), Option("second"), Option(234))
// def filter[A](col: Column[A], filterCriteria: Option[A]): Option[Boolean] = ???
// def filterClass(table: DTable, filter: DFilter): List[Option[Boolean]] = ???
def filterClass(t: DTable, f: DFilter): List[(Any, Any)] = zipClasses(t, f, filter)
val res = filterClass(dTable, dFilter)
println(res)
}
}
異なっています。我々は、フィールド名に類似性を無視して、私たちは次の操作を行うことができます種類に焦点を当てた場合
はあなたに
はあなたにドミトロありがとう – user1698641