首先,我们可以创建一个Poly1
类似size
,我们可以使用一个HList
映射到Strings
一个HList
。
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
多态函数L
类型的HList
映射到M
类型的HList
。
我们现在可以使用funRun
把一个Pair
到Strings
的HList
:
scala> funRun(Pair("abc", 12))
res1: shapeless.::[String,shapeless.::[String,shapeless.HNil]] = abc :: 12 :: HNil
但是你想返回List[String]
。为了把我们的HList
M
(映射到String
的结果)的List[String]
我们需要一个ToTraversable
,所以我们增加第三隐含参数:
import shapeless._, ops.hlist._
def pairToStrings[L <: HList, M <: HList](
p: Pair
)(implicit
gen: Generic.Aux[Pair, L],
mapper: Mapper.Aux[strings.type, L, M],
trav: ToTraversable.Aux[M,List,String]
): List[String] = gen.to(p).map(strings).toList
,我们可以为使用:
scala> pairToStrings(Pair("abc", 12))
res2: List[String] = List(abc, 12)
谢谢@Peter!这正是我所期待的! – arapmv
我关闭这个线程我在圈子里试图理解去了之后为什么以下基本增强复合型不起作用:'A级[T](VAL X:T); 对象克延伸POLY1 { 隐DEF caseString =在[字符串] {身份} }; DEF toStr [L <:HList]( 一个:A [字符串] )(隐式 创:Generic.Aux [A [字符串],L], 映射器:映射器[g.type,L] ) = gen.to(a).map(g)' – arapmv
你会得到哪个错误? –