![](/img/trans.png)
[英]Scala: How to transform an HList of ValidatedNel into a ValidatedNel of HList
[英]Scala: How to Filter Shapless HList based on Labels
我有以下幾點:
sealed trait baseData {
def weight: Int
def priority: Int
}
sealed trait moreData {
def weight: Int
def priority: Int
def t: String
def id: String
}
case class data1(override val weight: Int, override val priority: Int) extends baseData
case class moreData1 (override val weight:Int, override val priority: Int, override val t: String, override val id: String)extends moreData
並從諸如此類的案例類生成HList:
val h1 = LabelledGeneric[data1].to(data1(1,2))
val h2 = LabelledGeneric[moreData1].to(moreData1(3,4,"a","b"))
如何修剪或過濾h2
,使其僅保留h1
存在的字段? 我感覺我需要某種類似val filtered = h2.foldRight(HNil)(keepFunc)
,但是還無法弄清楚如何編寫keepFunc
。 有任何想法嗎?
您可以根據鍵進行過濾。 該代碼不是通用的,但希望足以說明這一概念。
val gen1 = LabelledGeneric[data1]
val gen2 = LabelledGeneric[moreData1]
val h1 = gen1.to(data1(1,2))
val h2 = gen2.to(moreData1(3,4,"a","b"))
val keys1 = Keys[gen1.Repr].apply
val keys2 = Keys[gen2.Repr].apply
object pair extends Poly2 {
implicit def default[T, U] = at[T, U]((_, _))
}
object keep extends Poly2 {
implicit def keepFunc[T, K, L <: HList] =
at[(T, K), L] { case ((t, key), l) =>
if (keys1.toList.contains(key)) t :: l else l
}
}
val filtered = h2.zipWith(keys2)(pair).foldRight(HNil)(keep)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.