HList的折叠?

3

假设:

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

1个回答

2
您需要一个“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,然后使用定义良好的Poly进行foldLeft操作。


谢谢,@wheaties。conv的意思是什么,也就是这个函数的名称? - Kevin Meredith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接