给定一个 HList 你如何得到一个 HMap
Given a HList how do you get a HMap
我有 HList
个 Symbols
。我想将其转换为 HMap
,HList
值作为 keys
,value
映射设置为基于 key
生成的对象。生成的对象保持状态,因此虽然可以知道默认映射,但后续状态不是。
没有进一步的信息并且基于对 HList 的非常肤浅的了解(我唯一的看法是 Tuple2
的列表),我想你可以通过迭代来做到这一点。一个可能的伪代码是:
// Presume tuple._1 is the key
val hmap = hlist.map{ tuple => (tuple._1, doSomething(tuple._1))}.toMap
嗯...问题是 Shapeless HMap
不像 HList
那样直接,但以下内容可以帮助您入门
import shapeless._
import poly._
val hList = 'omg1 :: 'omg2 :: 'omg3 :: HNil
// lets assume that you want to map Symbols to kv-pairs String -> Int
// hence your HMap will have kv-pairs "omg1" -> 1, "omg2" -> 2...
class BiMapIS[K, V]
implicit val stringToInt = new BiMapIS[String, Int]
object myFoldPolyFunc extends Poly {
implicit def caseSymbol = use(
(hmap: HMap[BiMapIS], elem: Symbol) =>
hmap + (elem.name -> elem.name.last.toString.toInt)
)
}
val hMap = hList.foldLeft(HMap.empty[BiMapIS])(myFoldPolyFunc)
val v1 = hMap.get("omg1")
// Some(1)
val v2 = hMap.get("omg2")
// Some(2)
我有 HList
个 Symbols
。我想将其转换为 HMap
,HList
值作为 keys
,value
映射设置为基于 key
生成的对象。生成的对象保持状态,因此虽然可以知道默认映射,但后续状态不是。
没有进一步的信息并且基于对 HList 的非常肤浅的了解(我唯一的看法是 Tuple2
的列表),我想你可以通过迭代来做到这一点。一个可能的伪代码是:
// Presume tuple._1 is the key
val hmap = hlist.map{ tuple => (tuple._1, doSomething(tuple._1))}.toMap
嗯...问题是 Shapeless HMap
不像 HList
那样直接,但以下内容可以帮助您入门
import shapeless._
import poly._
val hList = 'omg1 :: 'omg2 :: 'omg3 :: HNil
// lets assume that you want to map Symbols to kv-pairs String -> Int
// hence your HMap will have kv-pairs "omg1" -> 1, "omg2" -> 2...
class BiMapIS[K, V]
implicit val stringToInt = new BiMapIS[String, Int]
object myFoldPolyFunc extends Poly {
implicit def caseSymbol = use(
(hmap: HMap[BiMapIS], elem: Symbol) =>
hmap + (elem.name -> elem.name.last.toString.toInt)
)
}
val hMap = hList.foldLeft(HMap.empty[BiMapIS])(myFoldPolyFunc)
val v1 = hMap.get("omg1")
// Some(1)
val v2 = hMap.get("omg2")
// Some(2)