折叠 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.