如何将元素附加到 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 的特定子类型太粗糙了。