如何将元素附加到 KList?
How do I append an element to a KList?
如何在保持 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 的基础知识,所以欢迎任何其他 tips/advice。
尝试添加必要的隐式参数/上下文边界
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
的特定子类型太粗糙了。
如何在保持 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 的基础知识,所以欢迎任何其他 tips/advice。
尝试添加必要的隐式参数/上下文边界
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
的特定子类型太粗糙了。