2015-09-08 11 views
5

の内側に次のコードは、マッピングが機能

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をマップしてHListの文字列を取得し、HListの文字列をScala List [String]に変換したいと考えています。何か案は?

答えて

8

まず、我々はStringsHListHListをマッピングするために使用することができますsizeに似Poly1を作成することができます。

object strings extends Poly1 { 
    implicit def caseInt = at[Int](_.toString) 
    implicit def caseString = at[String](identity) 
} 

あなたは既にHListPairをオンにするGeneric[Pair]を使用していたが、あなたはそれの上にマッピングすることができ、あなたのfunrunで証拠がないので、あなたは、あなたのhpの上にマッピングすることができませんでした。暗黙のパラメータを使用してこれを解決できます。

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はタイプLHListPairを変えることができます。
  • 私たちの第二の暗黙のパラメータmapperはタイプMHListにタイプLHListをマッピングするために、当社のstrings多型の機能を使用することができます。

現在StringsHListPairをオンにするfunRunを使用することができます。

scala> funRun(Pair("abc", 12)) 
res1: shapeless.::[String,shapeless.::[String,shapeless.HNil]] = abc :: 12 :: HNil 

しかし、あなたはList[String]を返したかったです。

scala> pairToStrings(Pair("abc", 12)) 
res2: List[String] = List(abc, 12) 
+0

はありがとう:我々として使用することができます

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 

:我々はToTraversableを必要とするので、私たちは第三暗黙のパラメータを追加List[String]に私たちのHListMStringへのマッピングの結果)を有効にするには@ピーター!これはまさに私が探していたものです! – arapmv

+0

私はこのスレッドを閉じた後、なぜ複合型の次の基本的な拡張がうまくいかないのか理解しようとしているサークルに行ってきました: 'class A [T](val x:T); オブジェクトgはPoly1を拡張します。{ 暗黙のdef caseString = at [文字列] {identity} }; DEF括り[L <:HList( :[文字列] )(暗黙 GEN:Generic.Aux [A [文字列]、L]、 マッパー:マッパー[g.type、L] ) = gen.to(a).map(g) ' – arapmv

+0

どのエラーが表示されますか? –

関連する問題