使用带有Id的自然变换hmap

时间:2013-12-02 15:51:26

标签: scala shapeless

我想创建一个从类[A]到A的HMap,但我找不到一种看起来不丑的方法。我试过了:

val defaultValues = HMap[(Class ~?> Id)#λ](
    classOf[String] -> "",
    classOf[Int] -> 0)

但是我收到编译错误,因为Class [String],String没有隐式。我可以通过使用Id:

显式键入参数来进行编译
val defaultValues = HMap[(Class ~?> Id)#λ](
    classOf[String] -> ("": Id[String]),
    classOf[Int] -> (0: Id[Int]))

虽然它并不十分吸引人 - 有没有办法可以做到这一点而不需要“:Id [A]”?

1 个答案:

答案 0 :(得分:0)

HMap使用隐含的证据证明您已允许将键/值对放入地图中。当您构建HMap或将值放入其中或从中获取值时,您必须在隐式中编码所需的约束。

import shapeless.HMap

class HMapExample {

    class InstanceOfConstraint[K, V]

    implicit def instanceOfClass[T] = new InstanceOfConstraint[Class[T], T]

    val defaultValues = HMap[InstanceOfConstraint](
      classOf[String] -> "Hello",
      classOf[Int] -> 23
    )
}

应该做你需要的。