最初に、 を から にマップするために使用できる類似のPoly1
を作成できます。size
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
は、 aPair
をHList
of 型に変えることができますL
。
- 2 番目の暗黙のパラメーター
mapper
は、多態性関数を使用してof 型をof型strings
にマップできます。HList
L
HList
M
a をofに変換するために使用できるようfunRun
になりPair
ました:HList
Strings
scala> funRun(Pair("abc", 12))
res1: shapeless.::[String,shapeless.::[String,shapeless.HNil]] = abc :: 12 :: HNil
しかし、あなたは を返したかったのList[String]
です。(へHList
M
のマッピングの結果String
) をに変換するには、List[String]
が必要なToTraversable
ので、3 つ目の暗黙のパラメーター を追加します。
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)