折叠 HList?
Folding over HList?
给定:
import shapeless._
case class F(x: Option[Int], y: Option[Int])
我想帮忙写一个函数,f
:
def f(Option[Int] :: Option[Int] :: HNil): String
这样每个 Option[Int]
都被替换为 Some
数字或 empty
; ""
HNil
.
示例:
val res7 = Generic[F].to( F( Some(42), None) )
//res7: shapeless.::[Option[Int],shapeless.::
[Option[Int],shapeless.HNil]] = Some(42) :: None :: HNil
f(res7) === "42empty"
f
怎么写?
你需要 Poly
:
object OptFolder extends Poly2{
def conv(x: Option[Int]) = x.map(_.toString).getOrElse("empty")
implicit val ff = at{ (y: String, z: Option[Int]) => y + conv(z) }
}
val lala: String = myHlist.foldLeft("")(OptFolder) //:String not required
所以 Generic
转换为 HList
然后 foldLeft
定义明确 Poly
.
给定:
import shapeless._
case class F(x: Option[Int], y: Option[Int])
我想帮忙写一个函数,f
:
def f(Option[Int] :: Option[Int] :: HNil): String
这样每个 Option[Int]
都被替换为 Some
数字或 empty
; ""
HNil
.
示例:
val res7 = Generic[F].to( F( Some(42), None) )
//res7: shapeless.::[Option[Int],shapeless.::
[Option[Int],shapeless.HNil]] = Some(42) :: None :: HNil
f(res7) === "42empty"
f
怎么写?
你需要 Poly
:
object OptFolder extends Poly2{
def conv(x: Option[Int]) = x.map(_.toString).getOrElse("empty")
implicit val ff = at{ (y: String, z: Option[Int]) => y + conv(z) }
}
val lala: String = myHlist.foldLeft("")(OptFolder) //:String not required
所以 Generic
转换为 HList
然后 foldLeft
定义明确 Poly
.