【问题标题】:How to map HList to List[Type], List[TypeTag], or List[String]如何将 HList 映射到 List[Type]、List[TypeTag] 或 List[String]
【发布时间】:2014-08-13 10:55:10
【问题描述】:

我正在使用 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可以帮忙吗?

感谢您的帮助。

【问题讨论】:

    标签: scala shapeless hlist


    【解决方案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
    

    【讨论】:

    • 是的。那成功了。我花了一段时间才在方法中使用它,因为一开始我无法定义隐式帮助器类型。我只有一个问题:什么时候应该使用def apply[T](...),什么时候应该使用implicit def caseT[T] ...?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多