如何将HList映射到List [Type],List [TypeTag]或List [String]

时间:2014-06-23 11:54:55

标签: scala shapeless hlist

我正在使用Scala REPL及其绑定方法。不幸的是,需要ClassTag来删除类型的某些类型信息,例如List[Int]变为List[_]。所以我想将HList传递给我的REPL包装器并将类型作为字符串获取,我可以将其传递给bind方法。为此,我必须将HList映射到字符串列表。

def extract extends (Tuple2[String, T] ~>> String) {
    def apply[T](value: Tuple2[String, T]) = typeOf[T].toString
}

上面的代码不起作用。首先,我不能使用Tuple2。解决这个问题应该不难。但是,typeOf [T]需要隐式TypeTag。知道我怎么能这样做吗?可以show帮忙吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情,

scala> :paste
// Entering paste mode (ctrl-D to finish)

import scala.reflect.runtime.universe._
import shapeless._, poly._

object extract extends Poly1 {
  implicit def caseT[T: TypeTag] = at[(String, T)](_ => typeOf[T].toString)
}

// Exiting paste mode, now interpreting.

import scala.reflect.runtime.universe._
import shapeless._
import poly._
defined object extract

scala> val l = ("foo", 23) :: ("bar", true) :: ("baz", 2.0) :: HNil
l: ... = (foo,23) :: (bar,true) :: (baz,2.0) :: HNil

scala> l map extract
res0: String :: String :: String :: HNil = Int :: Boolean :: Double :: HNil