2013-06-06 1 views
2

형태가없는 스프레이 라이브러리를 연구하는 동안 많은 내부 Aux 유형, 특성, 객체 및 클래스를 보아 왔습니다. 기존 내부 API를 보강하는 데 사용된다는 것을 이해하는 것은 어렵지 않습니다. 공장 및 도우미 메소드의 "동반 객체 패턴"과 매우 유사합니다. HList 소스의 예 :가 편리 구성원으로 인코딩 된 길이를 가지고 있기 때문에 예를 들어 Length의 경우형태가없는 Aux 클래스 뒤에있는 패턴

trait Length[-L <: HList] { 
    type Out <: Nat 
    def apply() : Out 
} 

trait LengthAux[-L <: HList, N <: Nat] { 
    def apply() : N 
} 

object Length { 
    implicit def length[L <: HList, N <: Nat](implicit length : LengthAux[L, N]) = new Length[L] { 
    type Out = N 
    def apply() = length() 
    } 
} 

object LengthAux { 
    import Nat._ 

    implicit def hnilLength = new LengthAux[HNil, _0] { 
    def apply() = _0 
    } 

    implicit def hlistLength[H, T <: HList, N <: Nat](implicit lt : LengthAux[T, N], sn : Succ[N]) = new LengthAux[H :: T, Succ[N]] { 
    def apply() = sn 
    } 
} 

답변

0

Length 특성은, 우리가 결국 기대하는 모양이지만, 그 아니다 암시 적 검색을 수행하는 편리한 양식입니다. 따라서 "Aux"클래스가 도입되어 특성에 Out이라는 결과 매개 변수가 걸리고 길이가 NLengthAux의 유형 매개 변수에 추가됩니다. 이 결과 매개 변수가 특성의 실제 유형으로 인코딩되면 암시 적 범위의 LengthAux 특성을 검색 할 수 있습니다. L으로 검색하면이 유형의 길이가 N 매개 변수와 같을 것임을 알 수 있습니다 .

+0

왜 유형 멤버를 기반으로 암시 적 검색을 수행 할 수 없다고합니까? (https://gist.github.com/travisbrown/5721465)? –

+0

죄송하지만, 고맙습니다. – stew