我有这些:
trait A[T]
class X
class Y
object B {
def method[H :< HList](h: H) = h.toList[A[_]]
}
h
的参数method
将始终是A [T]的HList,如新的A [X] :: new A [Y] :: HNil。
我想将HList转换为List [A [_]]。
如何使用通用代码获取此代码,因为trait HList没有toList方法()?
答案 0 :(得分:8)
编译器错误应告诉您有关想要类型shapeless.ops.hlist.ToList[H, A[_]]
的隐式值的信息。您可以通过向方法签名添加隐式参数列表来提供其中一个:
object B {
def method[H <: HList](h: H)(implicit ev: ToList[H, A[_]]) = h.toList[A[_]]
}
现在您可以写下以下内容:
val someAs = new A[Int] {} :: new A[String] {} :: HNil
然后:
scala> B.method(someAs)
res0: List[A[_]] = List($anon$1@5dd508ef, $anon$2@4d3db309)
几乎HList
上的每个操作都需要这种隐含的证据。