映射压缩的 HList
mapping over zipped HLists
我正在尝试使用 shapeless 从两个 HList 中选择 "non-empty" 值:
import shapeless.{ HNil, Poly2}
object choose extends Poly2 {
implicit def caseInt =
at[Int,Int]{
case (_,n) if n > 0 => n
case (o,_) => o
}
implicit def caseString =
at[String,String] {
case (_,n) if n.nonEmpty => n
case(o,_) => o
}
}
val g = "a" :: "" :: 0 :: HNil
val h = "" :: "a" :: 5 :: HNil
g.zip(h).map(choose)
我收到有关缺少隐式映射器的错误
如果我理解正确,我需要提供证明 zip 的结果是可映射的,但我不确定该怎么做
你很接近,但是 choose
的定义有点错误:map
取 Poly1
而不是 Poly2
。
您正在映射元组的 hlist,因此您需要一个采用单个参数(元组)的多态函数。您提供的是一个带有两个参数的多态函数。差别很细微,但确实存在。
这是一个有效的版本:
import shapeless.{ HNil, Poly1 }
object choose extends Poly1 {
implicit def caseInt =
at[(Int,Int)]{
case (_,n) if n > 0 => n
case (o,_) => o
}
implicit def caseString =
at[(String,String)] {
case (_,n) if n.nonEmpty => n
case(o,_) => o
}
}
val g = "a" :: "" :: 0 :: HNil
val h = "" :: "a" :: 5 :: HNil
g.zip(h).map(choose) // "a" :: "a" :: 5 :: HNil
如您所见,诀窍是扩展 Poly1
而不是 Poly2
并在元组上定义 at
情况。
我正在尝试使用 shapeless 从两个 HList 中选择 "non-empty" 值:
import shapeless.{ HNil, Poly2}
object choose extends Poly2 {
implicit def caseInt =
at[Int,Int]{
case (_,n) if n > 0 => n
case (o,_) => o
}
implicit def caseString =
at[String,String] {
case (_,n) if n.nonEmpty => n
case(o,_) => o
}
}
val g = "a" :: "" :: 0 :: HNil
val h = "" :: "a" :: 5 :: HNil
g.zip(h).map(choose)
我收到有关缺少隐式映射器的错误 如果我理解正确,我需要提供证明 zip 的结果是可映射的,但我不确定该怎么做
你很接近,但是 choose
的定义有点错误:map
取 Poly1
而不是 Poly2
。
您正在映射元组的 hlist,因此您需要一个采用单个参数(元组)的多态函数。您提供的是一个带有两个参数的多态函数。差别很细微,但确实存在。
这是一个有效的版本:
import shapeless.{ HNil, Poly1 }
object choose extends Poly1 {
implicit def caseInt =
at[(Int,Int)]{
case (_,n) if n > 0 => n
case (o,_) => o
}
implicit def caseString =
at[(String,String)] {
case (_,n) if n.nonEmpty => n
case(o,_) => o
}
}
val g = "a" :: "" :: 0 :: HNil
val h = "" :: "a" :: 5 :: HNil
g.zip(h).map(choose) // "a" :: "a" :: 5 :: HNil
如您所见,诀窍是扩展 Poly1
而不是 Poly2
并在元组上定义 at
情况。