2016-06-29 12 views
4

가정한다 I 컨테이너 마커를 value 특정 유형 T 일부 ID를 나타내는HList는

case class TypedString[T](value: String) 

있다.

나는 두 개의 클래스

case class User(id: String) 
case class Event(id: String) 

이 내가 몇 가지 물건 않는 기능이 있습니다

def func[L <: HList](l: L)(...) {...} 

그래서 내가

func[TypedString[User] :: TypedString[Event] :: HNil](
    TypedString[User]("user id") :: TypedString[Event]("event id") :: HNil 
) 

과 같이 사용할 수 있습니다 (이것은 나를 위해 중요 형식 서명을 명시 적으로 유지하기 위해)

,210

는 질문 : 변경하거나 짧은 형식의 서명을 가지고 FUNC를 확장하는 방법처럼 (전용 마커 유형을 유지) :

shapeless.ops.hlist.Mapped 타입의 클래스는 하나 HList L의 관계 및 다른 HList 요소를 제공
func[User :: Event :: HNil](
    TypedString[User]("user id") :: TypedString[Event]("event id") :: HNil 
) 

답변

2

L은 형식 생성자로 래핑됩니다. 당신은 지금 두 가지 유형 지정하려는 L 유형과 다른 유형 (TypedString에 싸여 L의 요소)를 가지고 있기 때문에 우리가 원하는하지 않았기 때문에

, 우리는 우리가 다음 your previous question (에 사용 된 것과 같은 트릭을 사용할 필요가 한 번에 모든 인수를 제공해야합니다. 이제는 첫 번째 유형 만 지정하기 때문입니다. 당신이 원하는대로

import shapeless._ 
import ops.hlist.Mapped 

def func[L <: HList] = new PartFunc[L] 

class PartFunc[L <: HList] { 
    def apply[M <: HList](m: M)(implicit mapped: Mapped.Aux[L, TypedString, M]): M = m 
} 

이제 func를 사용할 수 있습니다

func[User :: Event :: HNil](
    TypedString[User]("user id") :: TypedString[Event]("event id") :: HNil 
) 
// TypedString[User] :: TypedString[Event] :: HNil = 
//  TypedString(user id) :: TypedString(event id) :: HNil