我正在玩Shapeless,我正在尝试计算HList
Option
的{{1}}个powerset。基本上,我想将HList
解释为一个集合,在这种情况下,元素的Option
值告诉我它属于集合。
例如,给定Some(5) :: Some("a") :: HNil
,我想获得以下HList
s:
Some(5) :: Some("a") :: HNil
Some(5) :: None :: HNil
None :: Some("a") :: HNil
None :: None :: HNil
我尝试了以下内容:
object test2 extends Poly2{
implicit def someA[A,B <: HList] : Case.Aux[Some[A], List[B], List[Option[A] :: B]] = at{(a, hls) =>
val x: List[Option[A] :: B] = hls.flatMap{ hl =>
List(
a :: hl,
None :: hl
)
}
x
}
implicit val none : Case.Aux[None.type, List[HList], List[HList]] = at{(_, hls) =>
hls.map(hl => None :: hl)
}
}
h.foldRight(List(HNil))(test2)
没有成功。我在foldRight
:
Error:(36, 25) could not find implicit value for parameter folder: shapeless.ops.hlist.RightFolder[Some[Int] :: None.type :: shapeless.HNil,List[shapeless.HNil.type],A$A8.this.test2.type]
h.foldRight(List(HNil))(test2);}
^
我开始认为我想要的东西在Shapeless中是不可能/没有意义的,因为Some[A]
和None
是不同的类型,我试图将它们混合起来,就像它们不是(例如List[Option[A] :: B]
中的someA
,但我很高兴被证明是错的。 :)
更新至初始问题:
感谢@ Marth的评论,我意识到我的代码工作正常,只要我没有使用IntelliJ Scala工作表!我使用普通object
并且它起作用了。
另外,我需要为Poly
Option[A]
添加一个案例。最终代码如下:
object combine1 extends Poly2{
implicit def optionA[A,B <: HList] : Case.Aux[Option[A], List[B], List[Option[A] :: B]] = at{(a, hls) =>
val x: List[Option[A] :: B] = hls.flatMap{ hl => a match {
case Some(_) =>
List(
None :: hl,
a :: hl,
)
case None =>
List(None :: hl)
}
}
x
}
implicit def someA[A,B <: HList] : Case.Aux[Some[A], List[B], List[Option[A] :: B]] = at{(a, hls) =>
val x: List[Option[A] :: B] = hls.flatMap{ hl =>
List(
None :: hl,
a :: hl
)
}
x
}
implicit val none : Case.Aux[None.type, List[HList], List[HList]] = at{(_, hls) =>
hls.map(hl => None :: hl)
}
}