映射到函数内的HList

时间:2015-09-08 00:49:30

标签: scala shapeless type-level-computation hlist

以下代码似乎足以编译和运行

case class Pair(a: String, b: Int)

val pairGen = Generic[Pair]

object size extends Poly1 {
  implicit def caseInt = at[Int](x => 1)
  implicit def caseString = at[String](_.length)
}

def funrun(p: Pair) = { 
  val hp: HList = pairGen.to(p)
  hp.map(size)
}

但编译器说“无法找到参数映射器的隐含值”。在我的用例中,我想映射一个HList来获取String的HList,然后将String的HList转换为Scala List [String]。有任何想法吗?

1 个答案:

答案 0 :(得分:9)

首先,我们可以创建一个类似于end=','的{​​{1}},我们可以将Poly1映射到size的{​​{1}}。

HList

您已使用HListStrings变为object strings extends Poly1 { implicit def caseInt = at[Int](_.toString) implicit def caseString = at[String](identity) } ,但您无法映射到Generic[Pair],因为您的证据不足Pair您可以映射它。我们可以通过使用隐式参数来解决这个问题。

HList
  • 我们的第一个隐式参数hp可以将funrun转换为def funRun[L <: HList, M <: HList]( p: Pair )(implicit gen: Generic.Aux[Pair, L], mapper: Mapper.Aux[strings.type, L, M] ) = gen.to(p).map(strings) 类型为gen
  • 我们的第二个隐式参数Pair可以使用我们的HList多态函数将L类型mapper映射到类型为strings的{​​{1}} }。

我们现在可以使用HListL变为HList M

funRun

但是你想要返回Pair。要将我们的HList Strings(映射到scala> funRun(Pair("abc", 12)) res1: shapeless.::[String,shapeless.::[String,shapeless.HNil]] = abc :: 12 :: HNil )的结果转换为List[String],我们需要HList,因此我们添加第三个隐式参数:< / p>

M

我们可以用作:

String