我有DL <: HList,正在尝试在detailsIn: DL上使用mkString
val detail: String = detailsIn.mkString("", "; ", "")mkString在Shapeless中的定义如下:
def mkString(start: String, sep: String, end: String)
(implicit toTraversable: ToTraversable.Aux[L, List, Any]): String = this.toList.mkString(start, sep, end)我已经看到了许多定义需要ToTraversable隐含的函数的示例,但还没有人真正创建它的值(我怀疑我在Shapeless方面还不够精通,无法像我应该能够的那样容易地找到这些东西)。
我有以下需要填充???的片段,如果正确,我认为一个示例将非常有帮助:
implicit val dlToList: ToList[DL, Any] = new ToTraversable[DL, List] {???}然而,我怀疑可能已经有工厂方法可以做到这一点,但如果是这样的话,我还没有找到它。
发布于 2017-05-19 00:48:03
您不需要自己实例化这个值。相反,您应该要求它作为一个附加的隐式参数,并让编译器来完成这项工作:
def myMethod[DL <: HList](detailsIn: DL)(implicit ev: ToTraversable.Aux[DL, List, Any]) = {
val detail: String = detailsIn.mkString("", "; ", "")
println(detail)
}编辑
因为从myMethod的角度来看,您正在为任何DL <: HList寻找ToTraversable[DL, List]!编译器不可能计算出对于DL的每个可能实例,都有可能派生出一个ToTraversable (即使在这种特定情况下,这可能是通过结构归纳实现的)。
相反,实际调用myMethod(1 :: "s" :: HNil)的位置应该具有隐式解析ToTraversable.Aux[Int :: String :: HNil, List, Any]的所有静态信息。但是你可能会问,如果我不想在泛型上下文中调用myMethod呢?然后,您别无选择,只能在调用链上进一步传播该隐式约束,直到所有泛型都消失。
https://stackoverflow.com/questions/44053109
复制相似问题