首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无型HList返回类型

无型HList返回类型
EN

Stack Overflow用户
提问于 2020-11-06 05:10:55
回答 1查看 112关注 0票数 0

我正试图在我的代码中加入一些不成形的东西,并且陷入了一个令人尴尬的早期障碍。在下面的示例中,看来HCons一个未定义的对象到一个HNil:

代码语言:javascript
复制
trait HasValue[A, B] {
  def get(a: A): B
  def getAll[L <: HList, O <: HList](a: A)(implicit ga: GetAll[A, L]): O = ga.getAll(a, HNil)
}

trait GetAll[A, B] {
  def getAll[L <: HList, O <: HList](a: A, l: L): O
}
implicit def getAllIfHasValue[A, B](implicit ev: HasValue[A, B]) = new GetAll[A, B] {
  def getAll[L <: HList, O <: HList](a: A, l: L): O = ev.get(a) :: l
}

并得到一个错误- type mismatch: Found B :: L, Required O。我认为,既然L本身就是一个HList,那么B :: L本身就应该是一个HList,因此一切都应该很好。但显然不是。

任何帮助都很感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-06 12:08:40

我想错误是很明显的

代码语言:javascript
复制
type mismatch;
 found   : B :: L
 required: O

ev.get(a) :: lB :: L类型,但预期是O

--我认为,既然L本身就是一个HList,那么B :: L本身就应该是一个HList,因此一切都应该很好。

B :: L确实是HList。问题是B :: L不是O

当你写签名的时候

代码语言:javascript
复制
def getAll[L <: HList, O <: HList](a: A, l: L): O = ???

这意味着,对于任何类型的L <: HList--任何类型的 O <: HList,具有a: Al: L的值都会产生一个O类型的值。我想这不是你想要的。

也许您希望返回一个类型O,这取决于类型AB。然后您可以引入一个类型参数。

代码语言:javascript
复制
trait GetAll[A, B] {
  type O
  def getAll[L <: HList](a: A, l: L): O
}

或者您可能希望返回一个类型O,具体取决于ABL <: HList类型。此外,您还应该将L转换到特征级别。

代码语言:javascript
复制
trait GetAll[A, B, L <: HList] {
  type O
  def getAll(a: A, l: L): O
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64709188

复制
相关文章

相似问题

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