显式指定类型参数
val b = getValues[Parameter[Int] :: Parameter[Boolean] :: HNil, Int :: Boolean :: HNil](HList(Parameter(1), Parameter(true)))
HeadParam
从隐式
hCons
(
不仅仅是
<: Parameter[HeadParamValue]
是
Parameter[HeadParamValue]
)
implicit def hCons[TailParams <: HList, HeadParamValue, TailParamValues <: HList](
implicit tailParamOperations: ParameterOperations[TailParams, TailParamValues]
) = new ParameterOperations[Parameter[HeadParamValue] :: TailParams, HeadParamValue :: TailParamValues] {
override def values(params: Parameter[HeadParamValue] :: TailParams): HeadParamValue :: TailParamValues =
params.head.value :: tailParamOperations.values(params.tail)
}
ParameterOperations
你可以用标准
shapeless.ops.hlist.Comapped
和
shapeless.ops.hlist.NatTRel
object paramToIdNatTransform extends (Parameter ~> Id) {
override def apply[T](param: Parameter[T]): T = param.value
}
def getValues[Params <: HList, ParamValues <: HList](params: Params)(implicit
comapped: Comapped.Aux[Params, Parameter, ParamValues],
natTRel: NatTRel[Params, Parameter, ParamValues, Id]
): ParamValues = natTRel.map(paramToIdNatTransform, params)
val b = getValues(HList(Parameter(1), Parameter(true)))
println(b) // 1 :: true :: HNil
shapeless.ops.hlist.Mapper
够了,你可以写
val b = HList(Parameter(1), Parameter(true)).map(paramToIdNatTransform)
println(b) // 1 :: true :: HNil