2

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

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

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

谢谢你的帮助。

4

1 回答 1

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
于 2014-06-24T20:07:32.113 回答