以下代码似乎足以编译和运行
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]。有任何想法吗?
答案 0 :(得分:9)
首先,我们可以创建一个类似于end=','
的{{1}},我们可以将Poly1
映射到size
的{{1}}。
HList
您已使用HList
将Strings
变为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}} }。我们现在可以使用HList
将L
变为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