是否可以将HMap从类型A转换为其他多种类型?

时间:2019-02-27 05:52:41

标签: scala shapeless

Shapeless has HMaps用于加强异构映射的类型安全性,但似乎不允许从某种类型到多种类型的映射。

换句话说,这是有效的:

class BiMapIS[K, V]
implicit val stringToInt = new BiMapIS[String, Int]
implicit val intToString = new BiMapIS[Int, String]

val hm = HMap[BiMapIS](23 -> "foo", "bar" -> 13)

但这不是:

class BiMapIS[K, V]
implicit val stringToInt    = new BiMapIS[String, Int]
implicit val stringToString = new BiMapIS[String, String]

val hm = HMap[BiMapIS]("val1" -> 1, "val2" -> "two")

我的问题是:是否有一种方法可以允许从一种类型(例如String)到多种类型(例如String和{{ 1}})?

此外,对于该解决方案,我还没有嫁给Shapeless。

1 个答案:

答案 0 :(得分:2)

正确的方法需要一些检查:使用 export const PROJECT1_ROUTES = [{ path: '/1', loadchildren: 'projects/website/src/app/pages/module1#Module1' }] export const PROJECT2_ROUTES = [{ path: '*', loadchildren: 'projects/website/src/app/pages/module2#Module2' }] var routes = []; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { constructor( private router: Router ) { const selectedProject = window.id === 1 ? true : false; if(selectedProject) { this.router.resetConfig(PROJECT1_ROUTES) } else { this.router.resetConfig(PROJECT2_ROUTES) } } } 列出所有可能的值:

Coproduct

然后,您可以使自己成为一个有用的操作类,以帮助您从class BiMapIS[K, V] { type Value = V } implicit object strKey extends BiMapIS[String, Coproduct.`Int, String`.T] implicit object intKey extends BiMapIS[Int, Coproduct.`Boolean`.T] val hm = HMap[BiMapIS]( "val1" -> Coproduct[strKey.Value](1), "val2" -> Coproduct[strKey.Value]("two"), 3 -> Coproduct[intKey.Value](true) ) 中获取价值:

HMap

将它们放在一起:

implicit class HMapOps[R[_,_]](hm: HMap[R]) {
  def atKey[K,C <: Coproduct](k: K)(implicit ev1: R[K, C]) = new {
    def withValueType[V](implicit ev2: shapeless.ops.coproduct.Selector[C, V]): Option[V] = 
      hm.get(k).flatMap(_.select[V])
  }
}