首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将元素附加到KList?

如何将元素附加到KList?
EN

Stack Overflow用户
提问于 2019-12-28 04:48:09
回答 1查看 89关注 0票数 1

如何在保持KList的原始类型的同时将元素附加到KList?我对shapeless还是个新手,对于函数应该是什么类型,我真的不太清楚。

下面是我正在尝试做的一个例子。我想使用类型约束来确保所有值都符合Box[_],但是我也尝试了一个使用普通HList的无约束示例,但仍然无法编译它。

代码语言:javascript
复制
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的基础知识,所以任何其他的技巧/建议都是非常受欢迎的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-28 05:08:57

尝试添加必要的隐式参数/上下文界限

代码语言:javascript
复制
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的特定子类型太粗糙了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59505883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档