이 패턴을 사용하면 두 가지 일반 유형 매개 변수 사이의 관계를 설정할 수 있습니다.
은의이 경우 클래스에 대한 당신에게 일반적인
HList
표현을 제공 무형의 '
LabelledGeneric
형 클래스를 살펴 보자 :
trait LabelledGeneric[T] {
type Repr
}
T
은 즉 LabelledGeneric[MyCaseClass]
당신에게 MyCaseClass
의 HList 표현을 줄 것이다, 입력 유형입니다. Repr
은 출력 유형, 즉 T
에 해당하는 HList 유형입니다.
Generic
인스턴스를 사용하고 출력 유형의 다른 매개 변수가 필요한 메소드를 작성해 보겠습니다. 예를 들어 우리는 스칼라 당신이 여기 gen
또는 keys
에 액세스 할 수 없기 때문에이 작동하지 않는 것을 제외하고 레이블 일반
def fieldNames[T](implicit gen: LabelledGeneric[T], keys: Keys[gen.Repr]): keys.Repr …
의 필드 이름을 수집 Keys
를 사용할 수 있습니다. 구체적인 유형 또는 유형 변수를 가질 수 있습니다. 보조가 활동하기 시작하는 곳
은 그게 : 그것은 우리가 형태 변수로 "리프트"gen.Repr
하자 :
object Generic {
type Aux[T, Repr0] = Generic[T] { type Repr = Repr0 }
}
대로 Aux
유형이 유형의 변수에 Repr
에서 우리에게 방법을 제공 볼 수 있으므로, 우리는 마침내 foo
을 정의 할 수 있습니다 : 당신이 프롤로그에 익숙하다면
def foo[T, Repr, K](
implicit gen: LabelledGeneric.Aux[T, Repr],
keys: Keys.Aux[Repr, K]
): K …
당신이 증명하는 조건으로 보조를 읽을 수 있습니다 두 유형 변수 간의 관계. 위의 예에서 "LabelledGeneric은 Repr
이 T라는 레이블을 가진 일반 표현임을 증명하고 Keys.Aux는 K가 Repr의 모든 키 목록임을 증명합니다"라고 읽을 수 있습니다.
일부 토론은 내 대답 [여기] (http://stackoverflow.com/a/34548518/334519)을 참조하십시오. –