地図

2016-06-27 19 views
0

は、私は数が少ない我々はだから私は私のコードでは、このfunc 地図

よう
func(Set(1, 2) :: Set(3, 4) :: HNil, f) 

を使用することができます方法

def func[T <: HList](hlist: T, poly: Poly) 
    (implicit mapper : Mapper[poly.type, T]): Unit = { 
    hlist map poly 
} 

およびカスタムポリ

object f extends (Set ~>> String) { 
    def apply[T](s : Set[T]) = s.head.toString 
} 

を以下していると言います多くの数のfunc呼び出しが含まれています。この目的のために私は暗黙のパラメータへpoly: Polyを移動しようとしたメッセージ

illegal dependent method type: parameter appears in the type of another parameter in the same section or an earlier one 

がどのように変化するか(私は型シグネチャfunc[T <: HList](...)を維持する必要があります)このエラーを回避するためにpoly: Polyパラメータを拡張することができるか期待ましたか

答えて

1

たぶん、あなたはapplyメソッドを持つクラスを使用して、 "部分的に適用される" トリックを使用することができます。あなたのポリf

import shapeless._ 
import ops.hlist.Mapper 

final class PartFunc[P <: Poly](val poly: P) { 
    def apply[L <: HList](l: L)(implicit mapper: Mapper[poly.type, L]): mapper.Out = 
    l map poly 
} 

def func[P <: Poly](poly: P) = new PartFunc(poly) 

val ff = func(f) 
ff(Set(1, 2) :: Set(3, 4) :: HNil)   // 1 :: 3 :: HNil 
ff(Set("a", "b") :: Set("c", "d") :: HNil) // a :: c :: HNil 
+0

グレートトリックを、ありがとうございました! –