지도

2016-06-27 12 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 

가 어떻게 변경하거나 오류를 (I 타입 서명 func[T <: HList](...)을 유지하기 위해 필요) 피하기 poly: Poly 매개 변수를 확장 할 수 메시지 예상있어?

답변

1

어쩌면 당신은 apply 방법으로 클래스를 사용하여 "부분적으로 적용"트릭을 사용할 수 있습니다

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) 

당신 폴리 f로 :

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

위대한 속임수, 감사합니다! –