如果有一个Shapeless HList,其中每个列表元素都共享相同的类型构造函数,那么如何对HList进行排序?
例如:
def some[A](a: A): Option[A] = Some(a)
def none[A]: Option[A] = None
val x = some(1) :: some("test") :: some(true) :: HNil
val y = sequence(x) // should be some(1 :: "test" :: true :: HNil)
def sequence[L <: HList : *->*[Option]#λ, M <: HList](l: L): Option[M] =
???
我尝试实现这样的序列:
object optionFolder extends Poly2 {
implicit def caseOptionValueHList[A, B <: HList] = at[Option[A], Option[B]] { (a, b) =>
for { aa <- a; bb <- b } yield aa :: bb
}
}
def sequence[L <: HList : *->*[Option]#λ, M <: HList](l: L): Option[M] = {
l.foldRight(some(HNil))(optionFolder)
}
但是那样是无法编译的:
could not find implicit value for parameter folder: shapeless.RightFolder[L,Option[shapeless.HNil.type],SequencingHList.optionFolder.type]
你有没有关于如何实现这个功能的技巧,无论是针对像Option这样的具体示例,还是任意的Applicative?
F[M]
但找到了folder.Out
)。RightFolderAux使这一点清楚。 - mpilquistshapeless.ops.hlist.RightFolder
吗?在2.0.0版本中,它对我有效。 - Travis Brown