如何将通用HList转换为List

时间:2014-08-20 12:39:26

标签: scala shapeless

我有这些:

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方法()?

1 个答案:

答案 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上的每个操作都需要这种隐含的证据。