HList foldRight 正在运行,但 foldLeft 无法编译
HList foldRight is working, but foldLeft does not compile
这是 my previous question 的跟进。
因此,我正在尝试计算 HList 选项的(种类)powerset。基本上,我想将 HList 解释为一个集合,在这种情况下,元素的 Option 值告诉我它是否属于该集合。
我能够使用以下代码完成所需的操作:
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)
}
}
所有这些都适用于 foldRight
:
val h1 = Some(2) :: none[BigDecimal] :: Some("b") :: HNil
h1.foldRight(List(HNil))(combine1).foreach(println)
打印:
// None :: None :: None :: HNil
// Some(2) :: None :: None :: HNil
// None :: None :: Some(b) :: HNil
// Some(2) :: None :: Some(b) :: HNil
但是,foldLeft
不起作用。这是为什么?
h1.foldLeft(List(HNil))(combine1).foreach(println)
结果如下:
Error:(72, 26) could not find implicit value for parameter folder: shapeless.ops.hlist.LeftFolder[Some[Int] :: Some[Unit] :: Some[String] :: shapeless.HNil,List[shapeless.HNil.type],swaps.tec.util.Experiment.combine1.type]
我错过了什么?
N.B。我知道要使用 foldLeft
我最终需要反转每个 HList
以获得与 foldRight
相同的结果,但现在我只对实际左折叠初始 HList
。一旦我得到一个,我会修复输出:)
FoldLeft 以不同的顺序接受参数。您应该定义 Case.Aux[List[B], Option[A], ...]
.
这是 my previous question 的跟进。
因此,我正在尝试计算 HList 选项的(种类)powerset。基本上,我想将 HList 解释为一个集合,在这种情况下,元素的 Option 值告诉我它是否属于该集合。
我能够使用以下代码完成所需的操作:
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)
}
}
所有这些都适用于 foldRight
:
val h1 = Some(2) :: none[BigDecimal] :: Some("b") :: HNil
h1.foldRight(List(HNil))(combine1).foreach(println)
打印:
// None :: None :: None :: HNil
// Some(2) :: None :: None :: HNil
// None :: None :: Some(b) :: HNil
// Some(2) :: None :: Some(b) :: HNil
但是,foldLeft
不起作用。这是为什么?
h1.foldLeft(List(HNil))(combine1).foreach(println)
结果如下:
Error:(72, 26) could not find implicit value for parameter folder: shapeless.ops.hlist.LeftFolder[Some[Int] :: Some[Unit] :: Some[String] :: shapeless.HNil,List[shapeless.HNil.type],swaps.tec.util.Experiment.combine1.type]
我错过了什么?
N.B。我知道要使用 foldLeft
我最终需要反转每个 HList
以获得与 foldRight
相同的结果,但现在我只对实际左折叠初始 HList
。一旦我得到一个,我会修复输出:)
FoldLeft 以不同的顺序接受参数。您应该定义 Case.Aux[List[B], Option[A], ...]
.