Shapeless has HMap
s用于加强异构映射的类型安全性,但似乎不允许从某种类型到多种类型的映射。
换句话说,这是有效的:
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。
答案 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])
}
}