3

我有一个HListSymbols我想将其转换为HMapHListkeys并将value映射设置为基于key. 生成的对象保持状态,因此尽管默认映射可以知道后续状态不是。

4

2 回答 2

3

嗯...问题是 ShapelessHMap并不像 那样直接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)
于 2017-02-02T15:13:13.230 回答
-4

如果没有进一步的信息,并且基于对 HList 的非常肤浅的了解(我唯一的看法是 List of Tuple2),我想你可以通过迭代来做到这一点。一个可能的伪代码是:

// Presume tuple._1 is the key
val hmap = hlist.map{ tuple => (tuple._1, doSomething(tuple._1))}.toMap
于 2017-02-02T13:17:09.147 回答