2016-08-12 7 views
3

params가없는 메소드가 있다고 가정합니다. 유형 매개 변수의 길이는 어떻게 결정합니까?NList의 HList 유형 paremeter의 길이

def func[T <: HList]: Nat = { 
    // some magic 
} 
+0

Whaaaaat을 ........? paramemter 형의''lenght ''이란 무엇을 의미합니까? –

답변

5

당신은 HListNat 길이를 계산하는 ops.hlist.Length 작업을 사용할 수 있습니다.

또한 불투명으로 설정하면 Nat은 실용적인 숫자에 대한 모든 유형 수준 정보를 잃어 버리기 때문에별로 유용하지 않습니다. 그래서 당신은 함수에서 정확한 Nat 유형을 얻을 수 있습니다

import shapeless._ 
import shapeless.ops.hlist.Length 

def func[T <: HList](implicit len: Length[T]): len.Out = len() 

사용법 : Int가 더 까다 보인다


scala> natLen[Int :: String :: HNil] 
res1: shapeless.Succ[shapeless.Succ[shapeless._0]] = Succ() 
이 길이를 얻기. (물론, 그것은 새를 작성하는 것도 가능 내가 HKernel을 사용하여 다음과 같은 해결 방법을 발견했습니다

def uselessIntLen[T <: HList, N <: Nat](implicit 
    len: Length.Aux[T, N], 
    toInt: ToInt[N] 
): Int = toInt() 

: 그것이 N <: Nat 유형 매개 변수를 필요로 기본적으로 쓸모 만들 것 때문에, ops.nat.ToInt을 사용할 수 없습니다 보인다 수동으로 IntLength을 typeclass하십시오). 어쩌면 누군가가 더 직접적인 내장 된 방법으로 도움이 될 수 있습니다

import shapeless.ops.hlist.HKernelAux 

def intLen[T <: HList](implicit ker: HKernelAux[T]): Int = ker().length 

사용법 :

scala> intLen[Int :: String :: HNil] 
res2: Int = 2