首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Shapeless中实现ToTraversable?

如何在Shapeless中实现ToTraversable?
EN

Stack Overflow用户
提问于 2017-05-19 00:21:56
回答 1查看 245关注 0票数 2

我有DL <: HList,正在尝试在detailsIn: DL上使用mkString

代码语言:javascript
复制
val detail: String = detailsIn.mkString("", "; ", "")

mkString在Shapeless中的定义如下:

代码语言:javascript
复制
  def mkString(start: String, sep: String, end: String)
    (implicit toTraversable: ToTraversable.Aux[L, List, Any]): String = this.toList.mkString(start, sep, end)

我已经看到了许多定义需要ToTraversable隐含的函数的示例,但还没有人真正创建它的值(我怀疑我在Shapeless方面还不够精通,无法像我应该能够的那样容易地找到这些东西)。

我有以下需要填充???的片段,如果正确,我认为一个示例将非常有帮助:

代码语言:javascript
复制
implicit val dlToList: ToList[DL, Any] = new ToTraversable[DL, List] {???}

然而,我怀疑可能已经有工厂方法可以做到这一点,但如果是这样的话,我还没有找到它。

EN

回答 1

Stack Overflow用户

发布于 2017-05-19 00:48:03

您不需要自己实例化这个值。相反,您应该要求它作为一个附加的隐式参数,并让编译器来完成这项工作:

代码语言:javascript
复制
def myMethod[DL <: HList](detailsIn: DL)(implicit ev: ToTraversable.Aux[DL, List, Any]) = {
  val detail: String = detailsIn.mkString("", "; ", "")
  println(detail)
}

编辑

  1. 不要使用IntelliJ
  2. 如果myMethod可以找到隐式,为什么mkString找不到?

因为从myMethod的角度来看,您正在为任何DL <: HList寻找ToTraversable[DL, List]!编译器不可能计算出对于DL的每个可能实例,都有可能派生出一个ToTraversable (即使在这种特定情况下,这可能是通过结构归纳实现的)。

相反,实际调用myMethod(1 :: "s" :: HNil)的位置应该具有隐式解析ToTraversable.Aux[Int :: String :: HNil, List, Any]的所有静态信息。但是你可能会问,如果我不想在泛型上下文中调用myMethod呢?然后,您别无选择,只能在调用链上进一步传播该隐式约束,直到所有泛型都消失。

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

https://stackoverflow.com/questions/44053109

复制
相关文章

相似问题

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