如何在保持KList的原始类型的同时将元素附加到KList?我对shapeless还是个新手,对于函数应该是什么类型,我真的不太清楚。
下面是我正在尝试做的一个例子。我想使用类型约束来确保所有值都符合Box[_],但是我也尝试了一个使用普通HList的无约束示例,但仍然无法编译它。
import shapeless._
import shapeless.UnaryTCConstraint.*->*
case class Box[T](value: T)
case class BoxBuilder[B <: HList](boxes: B) {
def add[T](box: Box[T]): BoxBuilder[HList] = {
this.copy(boxes = boxes :+ box)
}
}
case class BoxBuilderTC[B <: HList : *->*[Box]#λ](boxes: B) {
def add[T](box: Box[T]): BoxBuilder[HList] = {
this.copy(boxes = boxes :+ box)
}
}我可能在这里错过了一些shapeless的基础知识,所以任何其他的技巧/建议都是非常受欢迎的。
发布于 2019-12-28 05:08:57
尝试添加必要的隐式参数/上下文界限
import shapeless._
import shapeless.UnaryTCConstraint.*->*
import shapeless.ops.hlist.Prepend
case class Box[T](value: T)
case class BoxBuilder[B <: HList](boxes: B) {
def add[T](box: Box[T])(implicit prepend: Prepend[B, Box[T] :: HNil]): BoxBuilder[prepend.Out] = {
this.copy(boxes = boxes :+ box)
}
}
case class BoxBuilderTC[B <: HList : *->*[Box]#λ](boxes: B) {
def add[T, Out <: HList : *->*[Box]#λ](box: Box[T])(implicit
prepend: Prepend.Aux[B, Box[T] :: HNil, Out]
): BoxBuilderTC[Out] = {
this.copy(boxes = boxes :+ box)
}
}通常,只编写HList而不编写HList的特定子类型太粗糙了。
https://stackoverflow.com/questions/59505883
复制相似问题