Scala 用Nat表示的HList型参数表的长度

Scala 用Nat表示的HList型参数表的长度,scala,shapeless,hlist,Scala,Shapeless,Hlist,假设我有一个没有参数的方法。如何确定类型参数的长度 def func[T <: HList]: Nat = { // some magic } def func[T您可以使用ops.hlist.Length操作来计算hlist的Nat长度 此外,将其作为不透明的Nat获取也不是很有用,因为您会丢失有关实际数字的所有类型级别信息。因此,您必须从函数中获取确切的Nat类型: import shapeless._ import shapeless.ops.hlist.Length def

假设我有一个没有参数的方法。如何确定类型参数的长度

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

def func[T您可以使用
ops.hlist.Length
操作来计算
hlist的
Nat
长度

此外,将其作为不透明的
Nat
获取也不是很有用,因为您会丢失有关实际数字的所有类型级别信息。因此,您必须从函数中获取确切的
Nat
类型:

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

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


将长度作为
Int
似乎更为棘手。您似乎不能使用
ops.nat.ToInt
,因为它需要
N whaaat……。?您所说的
“lenght”类型参数是什么意思?
scala> natLen[Int :: String :: HNil]
res1: shapeless.Succ[shapeless.Succ[shapeless._0]] = Succ()
def uselessIntLen[T <: HList, N <: Nat](implicit 
  len: Length.Aux[T, N], 
  toInt: ToInt[N]
): Int = toInt()
import shapeless.ops.hlist.HKernelAux 

def intLen[T <: HList](implicit ker: HKernelAux[T]): Int = ker().length
scala> intLen[Int :: String :: HNil]
res2: Int = 2