4

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

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

1 回答 1

5

您可以使用ops.hlist.Length运算来Nat计算HList.

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

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

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

用法:

scala> natLen[Int :: String :: HNil]
res1: shapeless.Succ[shapeless.Succ[shapeless._0]] = Succ()

获得长度Int似乎更棘手。似乎你不能使用ops.nat.ToInt,因为它需要一个N <: Nat类型参数并且基本上使它无用:

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

我找到了以下解决方法HKernel(当然,也可以IntLength手动编写新的类型类)。也许有人可以提供更直接的内置方法:

import shapeless.ops.hlist.HKernelAux 

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

用法:

scala> intLen[Int :: String :: HNil]
res2: Int = 2
于 2016-08-12T17:41:58.643 回答