2016-07-23 3 views
5

형식 멤버가 형식 매개 변수로 추출되는 Aux 패턴 (셰이프리스 (shapeless) 및 다른 곳에서 사용됨)이 약간 있습니다. 동일한 인수 목록의 인수가 ' 서로 의존하지만, 일반적으로 그것이 무엇을 위해 사용되고 어떤 문제가 해결되는지 명확하지 않습니다.스칼라에서 Aux 패턴은 어떤 역할을합니까?

예를 들어, 현재 화이트 박스 매크로에 의해 반환 된보다 구체적인 유형을 보존하고 작업하는 방법을 알아 내려고 노력하고 있습니다. 이것은 Aux에 대한 유스 케이스입니까?

간단한 설명이 있습니까?

+0

일부 토론은 내 대답 [여기] (http://stackoverflow.com/a/34548518/334519)을 참조하십시오. –

답변

5

이 패턴을 사용하면 두 가지 일반 유형 매개 변수 사이의 관계를 설정할 수 있습니다.

은의이 경우 클래스에 대한 당신에게 일반적인 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의 모든 키 목록임을 증명합니다"라고 읽을 수 있습니다.

관련 문제